如何修复二叉树实现的StackOverflow错误?

时间:2019-06-20 10:03:58

标签: java algorithm binary-search-tree

这是二叉树实现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;
}

2 个答案:

答案 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