Java - 二进制树指针在初始化后仍为null?

时间:2016-05-03 10:18:27

标签: java data-structures binary-tree nodes

这个问题非常抽象,因此很难描述或搜索,因此我在这里。然而,这是一个非常简单的问题。

我有以下课程:

class Node<T>
{
    Comparable data;
    Node<T> left, right;

    public Node(Comparable data)
    {
        this.data = data;   
    }
}

如果我有以下情况会发生什么:

/*
* Imagine this root looks like the following:
*       10 (root)
*       /       \
    null        null
*/
Node root;

// Imagine we are inside of the insert method and this
// is the current value that is going to be inserted.
int valueIAmTryingToInsert = 5;

// As we see from the tree above, "child" WILL be null.
Node child = (valueIAmTryingToInsert.compareTo(root.data) < 0 ? root.left : root.right);

if (child == null)
{
    child = new Node(data);
    return true;    
}

// Recursive statement would happen here.

请注意,child是指向root的左子项或右项的指针。但是,如果我实例化child指向的节点会发生什么?在调用child = new Node(data);之后,树当前是什么样的:

    10 (root)
    /       \
    5       null

如果看起来像那样,请解释原因。因为我的理解是即使Node child为空,指针仍然指向root的一个孩子。我很确定这不起作用,因为我的编辑在声明child中声明child = new Node(data);并声明The value new Node(data) assigned to 'child' is never used(即使它正在使用)。

2 个答案:

答案 0 :(得分:2)

您永远不会将其作为“左”分配给根节点。

简单地说,这就是你的代码所做的事情:

- root的左(或右)是null吗? -是 - 请创建一个新节点。

但是这个新节点和根节点之间没有任何关联。 你可能需要这样的东西:

Node root;
Node child;
Integer valueIAmTryingToInsert = 5;
if(valueIAmTryingToInsert.compareTo(root.data) < 0){
    if(root.left == null){
        root.left = new Node(valueIAmTryingToInsert);
    }
    child = root.left;
}else{
    if(root.right == null){
        root.right = new Node(valueIAmTryingToInsert);
    }
    child = root.right;
}
return true;    

编辑: 此代码只是一个示例,但如果root.data为null,则会因为比较而得到NullPointerException。这是你可能知道并照顾的事情。

编辑2: 我可以看到你仍然感到困惑,主要问题是你必须记住null不是对象的引用。它是一个“标记”,表示该对象尚未初始化。因此,当我说a = null; b = a不像ab指向同一个对象时(因为null不是有效的对象或引用),这意味着它们都有尚未初始化。它们是独立的自变量。然后,当我初始化一个a = new MyClass()时,我要求a的内存引用,但b仍然指向内存中无处。

请参阅null作为一种说明“此对象指向无处”的方式。 如果事情就像你在想的那样(如果我初始化a那么b也应该指向那里);那么程序中的每个空对象都应该指向a现在指向的位置。

答案 1 :(得分:1)

您需要了解child = new Node()将更改指针指向的对象,而不是指针指向的对象的任何值,并且绝对不是其他指针指向的对象(如root.left

即使在调用root.left之后,

childchild = root.left也不是同一个变量!他们只指向同一个对象。所以改变一个指向的东西不会影响另一个。

基本上,new Node()会在你的记忆中的某个地方创建一个新对象。 child = new Node()执行相同的操作,但之后它会告诉变量child指向新创建的对象而不是之前指向的对象。