Java指针或节点分配理解错误?

时间:2015-08-29 07:49:10

标签: java pointers tree nodes

我解决的一个问题是要求在二叉搜索树中插入一个节点,然后在最后返回整个二叉树的根。

我似乎遇到的问题是将插入的节点保存在原始树中,并给出它的根目录。我的代码如下:

static Node Insert(Node root,int value) {
    insertAux(root, value);
    return root;
}

static void insertAux(Node root, int value) {
    if (root == null) {
        root = new Node();
        root.data = value;
        root.left = root.right = null;
    } else {
        if (value > root.data) {
            insertAux(root.right, value);
        } else {
            insertAux(root.left, value);
        }
    }
}

当我使用以下树测试时:

    4
   / \
  2   7
 / \
1   3

它应该导致:

      4
   /    \
  2      7
 / \    /
1   3  6

我已经测试了这个,而且我的insertAux函数确实将root用户分配给一个新的Node(),并将该节点的数据命名为值6,当它遇到函数末尾的null case时。我还测试并确保我的Insert函数在整个调用结束时返回原始根。但是,当我尝试查看insertAux是否已将root.right.left分配给新的Node()并将其数据分配给Insert函数内部的6时,我得到一个空指针异常,其中root.right.left为null。为什么这样,我对Java的指针或节点赋值的理解是错误的?

2 个答案:

答案 0 :(得分:2)

static Node insertAux(Node root, int value) {
if (root == null) {
    root = new Node();
    root.data = value;
    root.left = root.right = null;
} else {
    if (value > root.data) {
        root.right = insertAux(root.right, value);
    } else {
        root.left = insertAux(root.left, value);
    }
}

return root;
}

你的insertAux()方法应该是这样的。

首先,它应该有一个返回类型作为Node。

您在这里做错的是您没有在父节点和子节点之间创建链接。因此,在您的情况下,创建一个包含数据6的新节点但实际上从未将其分配给其父

所以你需要通过返回它并将它分配给parent来分配新创建的节点。在你的方法中

if (value > root.data) {
        root.right = insertAux(root.right, value);
    } else {
        root.left = insertAux(root.left, value);
    }

答案 1 :(得分:1)

Java按值传递参数(即不通过引用),从函数返回后,root的内部赋值将丢失。尝试以不同的方式返回,也许

static Node insertAux(Node root, int value) {