0

私はいくつかのコードを持っています。メイン関数では、BST で 6 つの要素をプッシュします。デバッガーを見ると、変数サイズ = 5 であることがわかりますが、変数ルート = 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()rootのみになるには影響しませんnull。これは、Java が参照を値で渡すためです。の参照値をx新しいオブジェクトに割り当てて変更すると、同じではなくなりrootます。

2番目の方法ifからそのブロックを削除するだけです。push()最初のメソッドでのみそのタスクを実行する必要があります。2 番目のメソッドに渡す前に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 に答える