所以,我正在制作自己的二叉搜索树实现。在这样做的过程中,我遇到了一个不寻常的问题,我不知道它为什么会发生。
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 的索引时它不起作用。
我没有收到任何错误或警告,代码似乎可以正常运行,但结果不是我所期望的。
该方法没有正确设置右节点,尽管它使用相同的方法设置左节点,并且效果很好。
我希望我已经提供了足够的信息,我不想用代码轰炸每个人。
无关注意:
如果您对我的树的连接感到困惑,那是因为它不是您典型的二叉搜索树。但是,树的实际结构应该无关紧要。