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

变量节点是节点的数组列表,如果这很重要的话。

现在这是事情开始变得混乱的地方,是错误发生的地方。它位于BinaryNode类中的addDescendant方法中,该方法扩展了Node类。

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

这里需要注意的两个重要事项是setNode的使用。当我使用 0 的索引时它工作正常,但当我使用 1 的索引时它不起作用。

我没有收到任何错误或警告,代码似乎可以正常运行,但结果不是我所期望的。

该方法没有正确设置右节点,尽管它使用相同的方法设置左节点,并且效果很好。

我希望我已经提供了足够的信息,我不想用代码轰炸每个人。

无关注意:
如果您对我的树的连接感到困惑,那是因为它不是您典型的二叉搜索树。但是,树的实际结构应该无关紧要。

4

1 回答 1

0

Not much information. But I will try:
I think you tree is more unary than binary.
If an index of 1 marks the right child of a node but also marks the parent of a node, the logic seems somehow broken to me.

Second thing is in the 'Make left child' part of addDescendant:
It can happen that that more than 2 nodes have the 'root' node connected to their index 1.

At 'Make Right Child' part of addDescendant:
getLeftChild().setNode(1, node); Changing nodes of child nodes without further checkings (by not-using its addDescendant method) is not a good idea.

于 2013-04-04T14:36:21.517 回答