我在理解以下代码时遇到了问题。它是一个树数据结构,我不明白为什么我们在focusnode
方法中需要两个节点(父节点和addnode()
)。我试着用focusnode
来做这件事,但它没有成功。我的想法是将focusnode
设置为root,并保持循环直到focusnode
等于null
,并将focusnode
设置为newnode
。
public class tree {
node root;
public class node{
private int key;
private node left;
private node right;
node(int key){
this.key = key;
}
public int getkey(){
return key;
}
public node getleft(){
return left;
}
public node getright(){
return right;
}
}
public void addnode(int key){
node newnode = new node(key);
if(root == null){
root = newnode;
}else{
node focusnode = root;
node parent;
while(true){
parent = focusnode;
if(key < focusnode.key){
focusnode = focusnode.left;
if(focusnode == null){
parent.left = newnode;
return;
}
}else{
focusnode = focusnode.right;
if(focusnode == null){
parent.right = newnode;
return;
}
}
}
}
}
public void runnode(node focusnode){
if(focusnode != null){
runnode(focusnode.left);
runnode(focusnode.right);
System.out.println(focusnode.key);
}
}`
答案 0 :(得分:0)
因为如果您需要将新节点指定为parent
的{{1}}或.left
子节点(在您发现.right
...意味着{{ 1}} / focusnode == null
为null),那么您需要对.left
parent.right .right
parent.left`的引用。
因此,您需要将.left/.right child (the reference is from the parent). You can't set focusnode to your newnode, because it will only assign your newnode to focusnode and not to
引用设置为or
,但父级的focusnode
/ newnode
子节点不会引用您的.left
。< / p>
如果您来自C / C ++或类似的,请想象所有这些变量都是指针。 .right
指向newnode
指向的同一对象。将*focusnode
指向其他对象不会更改*parent.left
指向的内容。
Java中的所有变量都是引用(除了int / double之类的原语之外),它们类似于C / C ++中的指针。
答案 1 :(得分:0)
如果你正在做这样的检查:
if(key < focusnode.key){
focusnode = focusnode.left;
if(focusnode == null){
focusnode = newnode;
return;
}
}
}
您正在循环直到focusnode为null,然后创建新节点,但不将其附加到父节点。因此,当您尝试再次循环时,您无法循环通过根节点,因为它没有子节点!如果您希望避免处理父节点变量,则需要在设置focusnode之前检查条件中的子节点,并且如果子节点不为null,则仅设置focusnode。 e.g:
if(key < focusnode.key){
if(focusnode.left == null){
focusnode.left = newnode;
return;
} else {
foucusnode = focusnode.left;
}
}
}
右侧的检查是相同的。