如何以相反的顺序遍历此树

时间:2012-04-21 02:55:15

标签: algorithm tree binary-tree

我找到了Morris树遍历的实现,

它工作正常,但尝试有点问题 以相反的顺序遍历树.. -

    void MorrisTraversal(struct Node *root)
    {  
    struct Node *p,*pre;
    if(root==0) { return; }
    for(p=root;p!=0;)
    {
    if(p->Left==0) { printf(" %d ",p->Data); p=p->Right; continue; }
    for(pre=p->Left;pre->Right!=0 && pre->Right!=p;pre=pre->Right) { }
    if(pre->Right==0)
        { pre->Right=p; p=p->Left; continue; }
    else
        { pre->Right=0; printf(" %d ",p->Data); p=p->Right; continue; }

    }
}

2 个答案:

答案 0 :(得分:2)

按照相反的顺序,我假设你的意思是反向顺序遍历。您至少有两个选择:

  1. 您可以修改代码并将所有->Right指针引用交换为->Left个。

  2. 您可以将两个printf语句替换为堆栈。算法完成后,您将弹出堆栈中的数据以打印它们。然而,这无法实现Morris遍历算法的整个目的,即无堆叠算法。

  3. 此相关SO thread可能有助于您理解。

    我希望这会有所帮助。

答案 1 :(得分:1)

以下是Java中的一个示例。 Click Here再使用迭代而不是递归的另一个样本。

public int depthOfTree(TreeNode node){
    if(node == null){
        return 0;
    }

    int leftDepth = depthOfTree(node.left);
    int rightDepth = depthOfTree(node.right);

    if(leftDepth > rightDepth){
        return leftDepth+1;
    } else {
        return rightDepth+1;
    }
}

//Reverse Level with recursion
public void reverseLevelOrder(TreeNode node){
    int depth = depthOfTree(node);

    for(int i=depth;i>0;i--){
        printTree(node,i);
    }
}

public void printTree(TreeNode node, int level){
    if(node == null){
        return;
    }
    if(level == 1){
        System.out.print(node.data+" ,");
    } else if(level>1){
        printTree(node.left, level-1);
        printTree(node.right, level-1);
    }
}