二进制搜索树插入方法不起作用

时间:2013-11-17 21:18:41

标签: algorithm data-structures binary-search-tree

我想为二进制搜索树实现插入方法,并在下面提出解决方案。我知道有很多代码示例,但我想知道我的实现中存在什么问题?还是有问题?当我追踪它时,我以为我错过了一些东西。

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);
   }
 }

2 个答案:

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

对于替代方案,根必须作为一种特殊情况处理。