【问题标题】:Morris inorder Traversal莫里斯中序遍历
【发布时间】:2016-04-27 20:04:59
【问题描述】:

从这里学习 morris 中序遍历:http://www.geeksforgeeks.org/inorder-tree-traversal-without-recursion-and-without-stack/Explain Morris inorder tree traversal without using stacks or recursion

我很困惑。 cmets中有3个问题。欢迎帮助。谢谢

    while (current != null) {
        if (current.left == null) {
            visit(current);
            current = current.right;
        } else {
            pre = current.left;
            while (pre.right != null && pre.right != current) {
                pre = pre.right;
            } // Q1: why "pre.right != current"?
              // pre is initialized as current.left and will go right until null, 
              // why compare pre.right with current?

            if (pre.right == null) {
                pre.right = current;
                current = current.left;
            } else { // Q2: In which case, pre.right is not null and program gets here?
                pre.right = null;// Q3: why set pre.right to null?
                visit(current);
                current = current.right;
            }   

        } 

    } 

【问题讨论】:

  • 问题在哪里?

标签: algorithm tree binary-tree graph-traversal


【解决方案1】:

好的,如果我理解正确的话,这个遍历本质上是重构树,使最左边的节点位于树的根部。所以事情是这样开始的:

     D
   /   \
  B     F
 / \   / \
A   C E   G

看起来像这样:

A
 \
  B
 / \
A'  C
     \
      D
     / \
    B'  F
       / \
      E   G

其中A'A 及其所有子树。

访问后,它会重建树回来。

回答您的问题:

第一季度

在重构之前,pre.right != current 永远不会是循环结束条件,即永远不会为真。然而,重构之后,想象一下如果current 持有Bpre 将设置为 A',与 A 相同。 pre.right == A'.right == A.right == current。由于这意味着 A' 节点已经被访问过,它会中断循环并重建它,这会导致您的下一个问题。

第二季度

同样,这种情况在树的重建之前从未发生过,但在重建之后,当您到达一个已经被访问过的节点时,这就是“要做什么”。这又引出了你的下一个问题。

第三季度

pre.right 设置为 null,因为这意味着在重建之前,pre.right 最初为空。查看重构后的案例,节点Bpre 设置为A,这是一个叶子节点,并且没有右孩子。因此将其修复:

  B
 / \
A   C
     \
      D
     / \
    B'  F
       / \
      E   G

如您所见,A' 变成了 A,因为它的右孩子不再是 B 而是 null

本质上是为了帮助您更好地理解它:

  • Morris 遍历将树重构为根,因为它是最左边的节点(另请注意,它现在具有循环路径)
  • 一旦重建,它就会访问,然后将重建修复为原始形式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2013-12-31
    相关资源
    最近更新 更多