我有一项任务,我需要一些方法的帮助。
所以我有一棵这样的树:
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节点。
一个节点有两个链接(一个在左边,另一个在右边的子节点),并且没有链接到头部。
因此,使用当前方法,我能够成功执行前序遍历,我通过编写存储在节点上的元素的print语句进行测试。
但是当我运行测试时,它告诉我A中的下一个预订节点是B,而来自K的下一个预订节点抛出一个空异常,但它应该是I?
我出错的地方有什么想法吗?变量prev应该保存对最后访问的节点的引用,所以如果它等于节点v(我指定的节点,在v之后返回节点),我不应该得到下一个节点吗?
答案 0 :(得分:1)
我不确定递归执行该任务是否那么容易。
使用堆栈以迭代方式解决任务可能是一种更好的方法:
public BinaryTree preOrderNext(BinaryTree toSearch) {
Stack<BinaryTree> openList = new Stack<BinaryTree>();
openList.push(root);
while (openList.empty() == false) {
BinaryTree curr = openList.pop();
if (curr.getRight() != null)
openList.push(curr.getRight());
if (curr.getLeft() != null)
openList.push(curr.getLeft());
if (curr.equals(toSearch) && openList.empty() == false){
return openList.pop();
}
}
return null;
}
此方法未经过测试,但应该正常运行。
答案 1 :(得分:0)
以下是递归执行preorder traversal
的方法。
public void preOrderTraversal(BinaryTree root){
if(root == null) return;
System.out.println(root);
preOrderTraversal(root.getLeft());
preOrderTraversal(root.getRight());
}
注意:
root
为null时,您可以返回“emptyNode
”并通过if语句处理它。root
,root
更改任何级别。尝试通过贯穿期来想象这一点,您将理解这个概念。t
)。您可以继续调整结果。
最后要注意的是这种方法的运行时复杂性,我强烈建议您了解递归函数的运行时复杂性。它将来会帮助你很多。检查this wikipedia article是否有重复关系。
答案 2 :(得分:0)
我提供了一个在O(h)
运行时间内运行的答案。
class Node {
public int key;
public Node l;
public Node r;
public Node p;
public Node(int key) {
this.key = key;
this.l = null;
this.r = null;
this.p = null;
}
}
public Node preorderNext(Node v) {
if (v.l != null) {
return v.l;
} else if (v.r != null) {
return v.r;
} else {
while (v.p != null) {
if (v == v.p.l) {
if (v.p.r != null) {
return v.p.r;
} else {
v = v.p;
}
} else {
if (v.p.p == null) {
return null;
} else if (v.p == v.p.p.l) {
if (v.p.p.r != null) {
return v.p.p.r;
} else {
v = v.p;
}
} else {
v = v.p;
}
}
}
return null;
}
}