【问题标题】:Clarification over In-Order traversal in binary search tree澄清二叉搜索树中的有序遍历
【发布时间】:2015-11-25 08:16:19
【问题描述】:

我正在学习 Java 中的树,并且在我正在学习的书中遇到了一些令人困惑的行。中序遍历给出的图是这样的:

遍历(递归)的代码是:

private void inOrder(Node leftRoot) {
    if (localRoot != null) {
        inOrder(localRoot.leftChild);
        System.out.println(localRoot.iData + " ");
        inOrder(localRoot.rightChild);
    }
 }

我感到困惑的是:

现在我们回到 inOrder(A),刚刚从 A 的左边遍历返回 孩子。我们访问 A,然后以 C 作为参数再次调用 inOrder(), 创建 inOrder(C)。和 inOrder(B) 一样,inOrder(C) 没有孩子,所以 第 1 步不执行任何操作返回,第 2 步访问 C,第 3 步返回 不采取任何行动。 inOrder(B) 现在返回到 inOrder(A)

然而, inOrder(A) 现在完成了,所以它返回并且整个遍历是 完全的。 节点被访问的顺序是A、B、C;他们 已按顺序参观。在二叉搜索树中,这将是 升序键的顺序。

我已经突出显示了我遇到的部分。首先,我认为在第三步中,inOrder(C)[而不是inOrder(B)]返回到inOrder(A)。其次,访问节点的顺序应该是B -> A -> C。

请帮帮我!

【问题讨论】:

  • 自 System.out.println(localRoot.iData + " ");在第二行,这个打印(或访问)顺序应该是 B->A->C。但是真正的访问顺序是A->B->C。
  • 你在这两种说法中都是正确的。
  • @Shloim 这是我在下面的回答中提到的 Robert Lafore 的数据结构和算法。一本适合初学者的相当不错的书,但我确实记得在学习它时没有发布勘误表让我感到沮丧。
  • 我只推荐这个,让你继续前进。 mitpress.mit.edu/books/introduction-algorithms

标签: java algorithm recursion tree


【解决方案1】:

是的,你在这两个方面都是正确的。这些似乎是拼写错误,或勘误表

作为旁注,我认可您帖子中的图表风格,因为我多年前从同一本书 (Lafore) 中学习了数据结构。不幸的是,他似乎没有在任何地方发布勘误表,这令人失望,因为大多数作者都在努力做到这一点。

【讨论】:

  • 第二个声明不是错误。正如@RogerDwan 解释的那样,这本书指的是A,B,C的访问顺序,而不是B,A,C的输出顺序
  • 他明确指出“它们已按顺序访问。在二叉搜索树中,这将是升序键的顺序。”所以要么他弄错了,要么他在同一个句子中以两种不同的方式定义了“访问顺序”。
  • 如果图片和代码都来自那本书,它应该被修复,因为图片和代码都在第二行显示了它的“访问操作”。我认为这就是@Manish 感到困惑的原因。
  • 我认为@Shloim 是对的。在我看来,访问顺序应该是指遍历顺序,它又应该和输出顺序一样,根据递归方法中定义的代码。或者访问顺序与遍历不同订购?
  • 很好地发现了这一点。即使您不处理错误的句子,这个主题也足够令人困惑。
猜你喜欢
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多