0

我有一些代码。在主要功能中,我在 BST 中推送六个元素。当我查看调试器时,我看到变量 size = 5,但变量 root = null。为什么变量根不改变。

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);
}

}

4

2 回答 2

5

在您的if块中,分配:

x = new Node(k,v);

不会使您的root参考点指向新Node对象。它只是分配给的该方法的本地x引用new Node()。不会影响rootnull只会影响。这是因为,Java 按值传递引用。一旦通过将其分配给新对象来更改参考值x,它将root不再相同。

只需从第二种方法中删除该if块即可。push()您应该只在第一种方法中执行该任务,在将其传递给第二种方法之前push()初始化自身:rootpush()

public void push(Key k, Val v){
    if (root == null) {
        root = new Node(k, v);
        size++;
        return;
    }
    push(root,k,v);
}
于 2013-09-16T16:29:27.987 回答
0

因为你在传递rootpush(Key k, Val v)。所以对 x 的分配不会分配字段root

于 2013-09-16T16:31:31.493 回答