这是二叉树实现here的示例。 此代码可以正常工作。 但是我可以在 add 方法中将根创建为单个一次性节点。
代替
public void add(int value) {
root = addRecursive(root, value);
}
我愿意
public void add(int value) {
if (root == null) {
root= new Node(value);
}
// then i add left- and right-leafs recursively
if (value < root.value) {
root.left = addRecursive(root, value);
} else if (value > root.value) {
root.right= addRecursive(root, value);
}
}
如果我添加3个或更少的节点-没关系
bt.add(2);
bt.add(1);
bt.add(3);
但是,如果我添加了3个以上的节点,由于递归函数,则会出现StackOverflow错误
private Node addRecursive(Node current, int value) {
if (current == null) {
return new Node(value);
}
if (value < current.value) {
current.left = addRecursive(current.left, value);
} else if (value > current.value) {
current.right = addRecursive(current.right, value);
}
return current;
}
答案 0 :(得分:1)
Edit2 :(重新附加了原始答案)
您的问题在于添加方法中的这一部分。
if (value < root.value) {
root.left = addRecursive(root, value);
} else if (value > root.value) {
root.right= addRecursive(root, value);
}
在调用addRecursive时,您应该传递root.left / right而不是root本身,否则最终将获得root.left / right == root。
编辑: 如我最初所写,问题在于您的add方法中的addRecursive方法。但是在思考的时候,我莫名其妙地感到困惑。
最后我了解了这个问题,因此在这里添加了详细的解释:
使用以下命令创建根要素之后 根(值= 2,左=空,右=空)
您再次使用值1调用add方法。 导致通话
root.left = addRecursive(root, 1);
这导致... (请注意,当前= root.left)
root.left = addRecursive(root.left, 1);
最终创建节点的
return new Node(1)
让我们将其称为node1 (值= 1,左=空,右=空)
所以你有
(在您的addRescursive方法中)
root.left = node1
,现在出现错误: 您返回root,可以让
(在您的添加方法中)
root.left = root.
因此将通话替换为 解决此问题的方法是addRecursive(root.left,value)而不是addRecursive(root,value)。
与root.right相同。
无论如何,返回和分配已经添加的节点是什么 首先我很困惑,所以我仍然建议将递归与添加分开。
答案 1 :(得分:1)
必须为
addRecursive(root.left, value)
addRecursive(root.right, value)
即不是root