【发布时间】:2013-03-04 16:58:03
【问题描述】:
我有一个任务,我需要一些方法方面的帮助。
所以我有一棵这样的树:
A
/ \
B C
/ \ / \
D E F G
/ \
H I
/ \
J K
我的方法是:
public BinaryTree preorderNext(BinaryTree t, BinaryTree v, BinaryTree prev) {
prev = t;
if(t.getLeft() != null) {
preorderNext(t.getLeft(), v, prev);
}
if(t.getRight() != null) {
preorderNext(t.getRight(), v, prev);
}
if(prev == v) {
return t;
}
return null;
}
讲师给出了树的简单实现。该类称为 BinaryTree,如果您想创建一个节点链接到它,那么您指定左右子 BinaryTree 节点是什么。
一个节点有两个链接(一个在左边,另一个在右边子节点)并且没有到头部的链接。
因此,使用当前方法,我能够成功地进行前序遍历,我通过编写存储在节点上的元素的打印语句进行测试。
但是当我运行测试时,它告诉我来自 A 的下一个预购节点是 B,来自 K 的下一个预购节点抛出空异常但应该是 I?
关于我哪里出错的任何想法?变量 prev 应该包含对访问的最后一个节点的引用,所以如果它等于节点 v(这是我指定的节点,返回 v 之后的节点),我不应该得到下一个节点吗?
【问题讨论】:
-
可以修改函数签名吗?处理
root比处理t、v和prev要容易得多。这是因为树的每个孩子本身也是一棵树。 -
什么意思? t 是我可以传入的树的根。
-
你应该持有递归的方法,而不是再次将之前访问过的信息传递给方法;此信息已经在堆栈中。我将发布一个答案来解释我的前序遍历方法。
标签: java binary-tree preorder