【问题标题】:BST implementation javaBST实现java
【发布时间】:2021-07-14 21:00:38
【问题描述】:

我学过 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 中您不需要通过引用传递参数,所以我看不到问题。你能帮帮我吗?

【问题讨论】:

    标签: java arrays recursion data-structures


    【解决方案1】:

    这行代码

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

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

    Oracle docs:

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

    【讨论】:

    • 我还是不明白……那我该怎么改呢?
    • 考虑在 addElement 中创建新的节点实例
    【解决方案2】:

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

    因此,与其在addElementNotSeen 中检查node 是否为null,不如在addElement 中检查this.root 是否为null,然后直接实例化。

    public void addElement(int x)
         {
             if(this.root == null)
                this.root = new node(x, null, 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, null);
                     else
                         addElementNotSeen(x , curent.right);
                 }else{
                     // the same for left
                 }        
             }
         } 
    

    【讨论】:

    • 所以,当我将 this.root 作为参数传递时,addElementNotSeen 方法被添加到堆栈内存中。在其中,“curent”将指向与“this.root”相同的对象,但是“curent”和“root”实际上是一样的吗?还是它们在内存中的地址不同?
    • curent 将指向与this.root 相同的对象,对,但是在您执行curent = ... 的那一刻,curent 将指向与this.root 不同的对象,不修改同一个对象。像使用 C++ 中的指针一样考虑 java 变量(如果您有使用它们的经验)。它们是引用,所以= 只是更改引用,而不是修改对象。
    • 我对C++很了解,我正在学习Java来启动android dev。谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2010-11-23
    • 2022-01-08
    • 2021-12-29
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多