bst实现java

hrirmatl  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(309)

我学的是c++,但对java还很陌生。我正在尝试编写一个二叉搜索树(bst)类。下面是我的代码:

public class binary_tree {
     public class node 
    {
        int data;
        node left , right;
        node(int data , node left , node right)
        {
            this.data = data;
            this.left = left;
            this.right = right;
        }
    }
     private node root = null;
     public void addElement(int x)
     {
         addElementNotSeen(x , this.root);
         //this function allows the user to only give x
         //as a parameter

     }
     private void addElementNotSeen(int x , node curent)
     {
         if (curent == null)
         {
             curent = new node(x , null , null);
         }
         else
         {
             if (x > curent.data)addElementNotSeen(x , curent.right);
             else addElementNotSeen(x , curent.left);        
         }
     } 
}

但是,我的根似乎没有得到任何值。我看到在java中,你不需要通过引用传递参数,所以我看不出问题所在。你能帮我吗?

e0uiprwp

e0uiprwp1#

这行代码

curent = new node(x , null , null);

没有任何影响 addElementNotSeen 因为它只修改本地引用。
请参阅oracle文档:
引用数据类型参数(如对象)也按值传递到方法中。这意味着当方法返回时,传入的引用仍然引用与以前相同的对象。但是,如果对象的字段具有适当的访问级别,则可以在方法中更改这些字段的值。

qrjkbowd

qrjkbowd2#

当你检查 nodenull 然后创建它,实际上是为参数的引用创建一个新节点,而不是为在函数外部传递的原始引用。
所以,与其检查 nodenulladdElementNotSeen ,检查是否 this.rootnulladdElement ,并直接示例化。

public void addElement(int x)
     {
         if(this.root == null)
            this.root = new node(x, null, null)
         else
             addElementNotSeen(x , this.root)
     }

当递归地将数据传递到树上时也是如此。别冒险过关 null 作为参数。检查是否 left 或者 right 如果为null,则直接创建它们,如前面的示例所示 this.root .

private void addElementNotSeen(int x , node curent)
     {
         else
         {
             if (x > curent.data){
                 if (curent.right == null)
                     curent.right = new node(data, null, null);
                 else
                     addElementNotSeen(x , curent.right);
             }else{
                 // the same for left
             }        
         }
     }

相关问题