2013-09-16 65 views
0

我有一些代碼。在主要功能中,我推入BST中的六個元素。當我看調試器時,我看到變量大小= 5,但變量root = null。爲什麼變量根不會改變。Java函數參數不變

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

}

回答

5

在你if塊,分配:

x = new Node(k,v); 

不會使你的root基準點到新Node對象。這只是分配給new Node()的該方法的當地x參考。它不會影響root,這隻會是null。這是因爲Java按值傳遞引用。一旦通過將參考值分配給新對象來更改參考值x,它將不再與root相同。

只需從第二個push()方法中刪除if塊。你還是做任務,僅在第一push()方法,在這裏你將它傳遞給第二push()方法之前初始化root本身:

public void push(Key k, Val v){ 
    if (root == null) { 
     root = new Node(k, v); 
     size++; 
     return; 
    } 
    push(root,k,v); 
} 
0

,因爲你在push(Key k, Val v)傳遞root的價值。所以對x的賦值不會分配字段root