2

だから、私は二分探索木の独自の実装を作っています。そうしているうちに、異常な問題に遭遇しましたが、なぜそれが発生しているのかわかりません。

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 を使用すると動作しません。

エラーや警告は表示されず、コードは正常に動作しているように見えますが、結果は期待したものではありません。

このメソッドは、同じメソッドを使用して左ノードを設定しているにもかかわらず、右ノードを適切に設定せず、正常に機能します。

十分な情報を提供できたことを願っています。すべての人にコードをぶつけたくはありませんでした。

無関係な注:
私のツリーの接続に混乱している場合、それは典型的な二分探索ツリーではないためです。ただし、ツリーの実際の構造は重要ではありません。

4

1 に答える 1