我想为二进制搜索树实现插入方法,并在下面提出解决方案。我知道有很多代码示例,但我想知道我的实现中存在什么问题?还是有问题?当我追踪它时,我以为我错过了一些东西。
public void insertBST(Node<Double> head, int value){
if (head == null){
head = new Node<Double>(value);
return;
}
else {
if (head.getValue() > value)
insertBST(head.getLeft(), value);
else
insertBST(head.getRight(), value);
}
}
答案 0 :(得分:1)
在功能开始时,您将新的Node
添加到您将无法访问此功能之外的部分
所以我假设你的Node类看起来像下面的
Class Node{
private Node left;
private Node right;
//constructor, setters and getters and stuff
}
您可以将代码修改为如下所示:
if (head.getValue() > value){
if(head.getLeft == null) {
head.setLeft(new Node<Double>(value));
return;
}
insertBST(head.getLeft(),value);
}
else{
if(head.getRight == null) {
head.setRight(new Node<Double>(value));
return;
}
insertBST(head.getRight(),value);
}
您还应移除此部分if (head==null)
并始终确保您在第一次通话中发送有效的Node
答案 1 :(得分:1)
重新分配传递的参数时,只是更改局部变量,而不是传递给函数的值。您可以阅读此问题以获取更多信息 - Is Java "pass-by-reference"?这是Java,对吗?无论哪种方式,类似的论点都可能适用。
这是这行代码的问题:
head = new Node<Double>(value);
您没有更改传递给函数的值,因此您永远不会添加到树中。
这里有两个选择,the option presented by amdorra或返回当前节点:
public void insertBST(Node<Double> current, int value)
{
if (current == null)
{
return new Node<Double>(value);
}
else
{
if (head.getValue() > value)
head.setLeft(insertBST(head.getLeft(),value));
else
head.setRight(insertBST(head.getRight(),value));
return current;
}
}
要调用该功能,您只需说:
root = insertBST(root, value);
对于替代方案,根必须作为一种特殊情况处理。