java - 二叉树插入根始终为空

标签 java tree binary-search-tree

我尝试编写一个递归函数来将节点添加到二叉树中。
问题是,虽然根在插入第一个元素后有一个新值
(由 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);
    }
}

命令行输出是:

New root value : 3

Exception in thread "main" java.lang.NullPointerException at polo.Tree.main(Tree.java:57)

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

最佳答案

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

关于java - 二叉树插入根始终为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32077266/

相关文章:

使用 mySQL 的 php 树递归

c - 你如何在 C 中的 BST 中删除一个数字的多个实例?

java - 构造函数中对共享静态变量的访问是否需要同步?

java - Makefile 运行多次

java - 更改对对象的引用会导致先前的对象数据被覆盖

c - 从 BST 返回当前节点

c - 如何在不释放内容的情况下释放指针?辅助变量

java - 是否有使用 DTO 的模式而不必复制域对象的属性?

neo4j - 查找具有共同二级关系的节点的所有子树

algorithm - 用于在树中查找支配集的多项式时间算法