这个问题非常抽象,因此很难描述或搜索,因此我在这里。然而,这是一个非常简单的问题。
我有以下课程:
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
(即使它正在使用)。
答案 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
不像a
而b
指向同一个对象时(因为null
不是有效的对象或引用),这意味着它们都有尚未初始化。它们是独立的自变量。然后,当我初始化一个a = new MyClass()
时,我要求a
的内存引用,但b仍然指向内存中无处。
请参阅null
作为一种说明“此对象指向无处”的方式。
如果事情就像你在想的那样(如果我初始化a
那么b
也应该指向那里);那么程序中的每个空对象都应该指向a
现在指向的位置。
答案 1 :(得分:1)
您需要了解child = new Node()
将更改指针指向的对象,而不是指针指向的对象的任何值,并且绝对不是其他指针指向的对象(如root.left
)
root.left
之后, child
和child = root.left
也不是同一个变量!他们只指向同一个对象。所以改变一个指向的东西不会影响另一个。
基本上,new Node()
会在你的记忆中的某个地方创建一个新对象。 child = new Node()
执行相同的操作,但之后它会告诉变量child指向新创建的对象而不是之前指向的对象。