私はバイナリ検索ツリーにキーと値のペアを格納するプログラムを作成しました。クラスには、ツリーのルートノードを追跡するルートポインタが含まれています。 This.rootはコンストラクタでnullに設定されます。メソッドは、渡された元のノードを変更しません(Java)
put(K、V)メソッドは、新しいキー/値のペアをツリーに挿入しようとします。キーがすでにツリーに存在する場合、メソッドはそのキーに対応する既存の値を返します。そうでない場合は、キー/値のペアがヘルパーメソッドput(K、V、BNode)を通じて挿入されます。 ***通常はthis.put(...)を返すだけですが、このコードスニペットでは戻り値nullに置き換えて、ルートノードが実際に変更されたかどうかを確認する前にprintステートメントを追加することがあります。
私のプログラムは、最初のキーと値のペアを挿入する際に失敗します。私は私の挿入物にprintステートメントを置き、メソッドが正しく動作するかどうかを確認しました。この場合、curr(これはちょうどthis.root)は、空のツリーから開始しているので、挿入前にはnullです。私は新しいノードを作成し、insert()でこのノードを返します。今currはこの作成されたノードを指し示します。 printステートメント "curr key" + curr.keyは正しいキーを出力し、このノードの作成が成功したことを示します。しかし、this.root.keyを印刷しようとするとNullPointerExceptionが発生します。 2番目のメソッドでcurrを修正すると、最初のメソッドでthis.rootも変更されますか?第二の方法でCURRの
//this.root is the root node of this binary search tree
public V put(K key, V val) {
System.out.println("put reached");
this.put(key, val, this.root); // original return statement
System.out.println("root key: " + this.root.key); // checks if root node was modified
// THIS print statement returns a NullPointerException
return null; // dummy return statement
}
private V put(K key, V val, BNode curr) {
V originalValue = this.get(key, curr); // returns null if key does not exist
//else returns corresponding key value
if (originalValue == null) {
curr = this.insert(key, val, curr); // helper method which uses recursion to insert
System.out.println("curr key " + curr.key); // checks if curr was modified
this.size++;
this.state++;
}
return originalValue;
}
private BNode insert(K newKey, V newValue, BNode n) {
if (n == null) {
return new BNode(newKey, newValue);
} else if (newKey.compareTo(n.key) < 0) {
n.left = this.insert(newKey, newValue, n.left);
} else {
n.right = this.insert(newKey, newValue, n.right);
}
return n;
}
ここでは、渡された参照値を変更するのではなく、オブジェクトのメソッドを操作します。 – trappski