【问题标题】:How to traverse this tree in reverse order如何以相反的顺序遍历这棵树
【发布时间】:2012-04-21 02:55:14
【问题描述】:

我找到了一个莫里斯树遍历的实现,

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

    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; }

    }
}

【问题讨论】:

  • 你试过什么?上面的代码是标准的前序 Morris 遍历。你可以在这里找到它是如何工作的解释:geeksforgeeks.org/archives/6358。如果您阅读并理解了这一点,那么走另一条路应该是一个简单的练习。

标签: algorithm tree binary-tree


【解决方案1】:

通过反向顺序,我假设您的意思是反向中序遍历。您至少有两种选择:

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

  2. 您可以将两个 printf 语句替换为压入堆栈。算法完成后,您将从堆栈中弹出数据以打印它们。然而,这违背了 Morris 遍历算法的全部目的,即无堆栈。

这个相关的SO thread可能会帮助你理解。

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这是一个 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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-01-14
      • 2011-11-02
      • 1970-01-01
      • 2022-11-02
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      相关资源
      最近更新 更多