我有一个任务,我需要一些方法的帮助。二叉树,返回预先遍历中的下一个节点
所以我有这样的树:
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'要容易得多。这是因为树的每个孩子本身也是一棵树。 – arin 2013-03-04 17:09:02
你是什么意思? t是我可以通过的树的根。 – tenkii 2013-03-04 17:12:06
您应该持有递归方法,而不是将先前访问过的信息再次传递给该方法;这些信息已经在堆栈中。我将发布一个答案来解释我的前序遍历的方法。 – arin 2013-03-04 17:16:06