【发布时间】: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