BST实现java

问题描述

我学习了 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);        
         }
     } 
}

然而,我的 root 似乎没有任何价值。我已经看到在 Java 中你不需要通过引用传递参数,所以我看不到问题。你能帮我吗?

解决方法

这行代码

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

addElementNotSeen 之外没有任何影响,因为它只修改本地引用。

Oracle docs

引用数据类型参数,例如对象,也是按值传递给方法的。这意味着当方法返回时,传入的引用仍然引用与以前相同的对象。但是,对象字段的值可以在方法中更改,如果它们具有适当的访问级别。

,

当您检查 node 是否为 null 然后创建它时,您实际上是在为参数的引用创建一个新节点,而不是为您在函数外部传递的原始引用创建一个新节点。

因此,与其检查 node 中的 null 是否为 addElementNotSeen,而是检查 this.root 中的 null 是否为 addElement,并实例化 直接。

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

在树中递归传递数据时也是如此。不要冒险将 null 作为参数传递。检查 leftright 是否为空,如果是,则直接创建它们,如前面使用 this.root 的示例所示。

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