【问题标题】:Binary Tree insert root always null [duplicate]二叉树插入根始终为空[重复]
【发布时间】:2015-08-18 16:00:44
【问题描述】:

我尝试编写一个递归函数来将节点添加到二叉树中。
问题是虽然根在插入第一个元素后有一个新值
(由 System.out.println() 确认),当我尝试通过 System.out.println() 获取 main 中的根值时,它仍然为空;

package polo;

public class BTNode {
    public int value;
    public BTNode left;
    public BTNode right;

    BTNode(int value){
        this.value = value;
        left = null;
        right = null;
    }
} 

package polo;

public class Tree {
public BTNode root;

    public Tree() {
        root = null;
    }

    public void add(int i, BTNode n) {
        if (n == null) {
            n =  new BTNode(i);
            System.out.println("New root value : " + n.value);
        } else {
            if (i < n.value) {
                if (n.left == null) {
                    n.left =  new BTNode(i);
                } else {
                    add(i, n.left);
                }
            } else { // i >= n.value
                if (n.right == null) {
                    n.right =  new BTNode(i);
                } else {
                    add(i, n.right);
                }
            }
        }
    }

    public static void main(String[] args) {
        Tree t = new Tree();
        t.add(3, t.root);

        System.out.println(t.root.value);
    }
}

命令行输出为:

新根值:3

线程“main”中的异常 java.lang.NullPointerException at polo.Tree.main(Tree.java:57)

(第 57 行是 System.out.println(t.root.value); 所在的位置)

【问题讨论】:

  • 对不起,我不明白你的评论。没有元素时根为空,但插入新元素后(root = new Node())它不应该为空?
  • @HovercraftFullOfEels 如果您不了解 Java 如何将参数传递给函数,这不是常识(有一个 n = ... 可能会更改 root)。
  • 顺便说一句:开发这棵树,使调用者只传递他们想要添加的值。不要让他们知道内部节点结构的任何事情。
  • @HovercraftFullOfEels rootn 的形式传递给add,然后重新分配。在 Java 中,如果您修改它,这将起作用,但如果您重新分配它,则不会。如果没有深入了解 Java 的工作原理,这种差异可能没有意义。至少这是我的观点。
  • 相关阅读-Is Java “pass-by-reference” or “pass-by-value”?(间接回答你的问题)

标签: java tree binary-search-tree


【解决方案1】:

Java 有引用,但没有对引用的引用。

当你有

public void add(int i, BTNode n) {
    if (n == null) {
        n =  new BTNode(i); // alters the local variable n only.

基本上add 不会改变 t.root。相反,您根本不应该传递root,而是让add 方法处理它。

public void add(int i) {
    if (root == null) {
        root = new BTNode(i);
    } else {
        root.add(i);
    }
}

【讨论】:

  • 我之前遇到过 OP 的问题,现在我想知道是否有一种语言引用了引用?我想知道如果一种语言可以处理这个问题,它会比混淆更有用吗?
  • 感谢您的友好回答。这解决了我的问题。
  • @bourbaki4481472 C/C++ 有 &amp;&amp;n*&amp;n&amp;*n**n 以及指向指针的指针,这些指针在某些数据结构中很有用。 (很少)
猜你喜欢
  • 2014-02-25
  • 2017-03-12
  • 2013-12-05
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 2015-12-06
  • 2015-02-13
  • 2019-08-26
相关资源
最近更新 更多