我有一些代码。在主要功能中,我在BST中推六个元素。当我看调试器时,我看到变量size = 5,但变量root = null。为什么变量root不会改变。
package Search;
public class BST<Key extends Comparable<Key>, Val> {
private class Node{
Key key;
Val val;
Node left;
Node right;
Node prev;
Node(Key k, Val v){
key = k;
val = v;
}
}
public void push(Key k, Val v){
push(root,k,v);
}
private void push(Node x, Key k, Val v){
if(x == null){
x = new Node(k,v);
size++;
return;
}
int cmp = x.key.compareTo(k);
if(cmp > 0)
push(x.left,k,v);
else if(cmp < 0)
push(x.right,k,v);
else
x.val = v;
}
Node root = null;
int size = 0;
public static void main(String args[]){
BST<String,Integer> bst = new BST<String, Integer>();
bst.push("c",1);
bst.push("b",2);
bst.push("d",3);
bst.push("a",4);
bst.push("e",5);
bst.push("c",6);
}
}
答案 0 :(得分:5)
在if
区块中,分配:
x = new Node(k,v);
不会将root
引用点指向新的Node
对象。它只是分配给x
的该方法的本地new Node()
引用。它不会影响root
,只会null
。这是因为Java通过值传递引用。通过将参考值分配给新对象来更改x
的参考值后,它将不再与root
相同。
只需从第二个if
方法中移除push()
块即可。您应该只在第一个push()
方法中执行该任务,在将root
本身传递给第二个push()
方法之前初始化public void push(Key k, Val v){
if (root == null) {
root = new Node(k, v);
size++;
return;
}
push(root,k,v);
}
:
{{1}}
答案 1 :(得分:0)
因为您在root
中按值传递了push(Key k, Val v)
。因此,对x的赋值不会指定字段root
。