だから、私は二分探索木の独自の実装を作っています。そうしているうちに、異常な問題に遭遇しましたが、なぜそれが発生しているのかわかりません。
setNode メソッド:
// Sets the Node at the specified Index
public void setNode(int index, NodeInterface<E> node)
{
if(index < 0 || index >= degree)
throw new ArrayIndexOutOfBoundsException("Index: " + index + ", Size: " + nodes.size());
nodes.set(index, (Node<E>) node);
}
重要な場合、変数nodesはノードの配列リストです。
これが、エラーが発生している場所であり、物事が混乱し始める場所です。これは、 Nodeクラスを拡張するBinaryNodeクラス内のaddDescendantメソッドにあります。
addDescendant メソッド:
// Adds the specified Descendant to this Node
public boolean addDescendant(BinaryNode<E> node)
{
// Determine Node Type
if(compareTo(node) > 0) // Make Left Child
{
if(hasLeftChild())
return getLeftChild().addDescendant(node);
else
{
setNode(0, node); // Link Parent to Child
// ^^^ Works Fine ^^^
node.setNode(1, hasRightChild() ? getRightChild() : this); // Link Child to Parent or Sibling
// ^^^ Does not Work ^^^
return true;
}
}
else if(compareTo(node) < 0) // Make Right Child
{
if(hasRightChild()) // Node already has a Right Child
return getRightChild().addDescendant(node);
else // Node does not have a Right Child
{
if(hasLeftChild())
{
getLeftChild().setNode(1, node); // Link Sibling to Sibling
// ^^^ Does not Work ^^^
}
else
{
setNode(0, node); // Link Parent to Child for the time being
// ^^^ Works Fine ^^^
}
node.setNode(1, this); // Link Child to Parent
// ^^^ Does not Work ^^^
return true;
}
}
else // Duplicate Node
return false;
}
ここで注目すべき 2 つの重要な点は、setNodeの使用です。インデックス 0 を使用すると正常に動作しますが、インデックス 1 を使用すると動作しません。
エラーや警告は表示されず、コードは正常に動作しているように見えますが、結果は期待したものではありません。
このメソッドは、同じメソッドを使用して左ノードを設定しているにもかかわらず、右ノードを適切に設定せず、正常に機能します。
十分な情報を提供できたことを願っています。すべての人にコードをぶつけたくはありませんでした。
無関係な注:
私のツリーの接続に混乱している場合、それは典型的な二分探索ツリーではないためです。ただし、ツリーの実際の構造は重要ではありません。