我的任务是创建2-3棵树。我已经完成了所有必需的类和方法,但是我的split方法遇到了困难。我可能对这种方式的想法太多了,我的头在旋转,似乎无法摆脱自己陷入困境的想法。
如果只需要分割一个叶子节点,我就不会有问题。我似乎陷入困境的地方是必须拆分叶节点,然后拆分上面的父节点。据我了解,断开子级,然后拆分,然后子级连接的过程都将根据最初拆分的子级而有所不同。
即,如果我有以下树,则我的第一个拆分发生在叶节点(例如,根的第二个子节点的第三个子节点13 | 14)。这个分裂过程的处理方式不同于说根的第三个孩子的拳头孩子(19 | 20)。
9 |18
3 | 6 12 | 15 21 | 24
1 | 2 4 | 5 7 | 8 10 | 11 13 | 14 16 | 17 19 | 20 22 | 23 25 |26
我遇到问题的拆分方法部分是:
if (upperRight != null)
{
if (childIndex == 0)
{
parent.connectChild(1, newRight);
newRight.connectChild(0, child1);
newRight.connectChild(1, child2);
}
else if (childIndex == 1)
{
upperRight.connectChild(0, newRight);
}
else if (childIndex == 2)
{
upperRight.connectChild(0, newRight);
}
}
else
{
Node temp = parent.disconnectChild(1);
parent.connectChild(1, newRight);
parent.connectChild(2, temp);
if (childIndex == 0)
{
temp = newRight.disconnectChild(0);
newRight.connectChild(0, child1);
newRight.connectChild(1, child2);
newRight.connectChild(2, temp);
}
else if (childIndex == 1)
{
thisNode.connectChild(1, child1);
newRight.connectChild(1, child2);
}
else if (childIndex == 2)
{
temp = newRight.disconnectChild(0);
thisNode.connectChild(1, child1);
newRight.connectChild(0, child2);
newRight.connectChild(1, temp);
}
}
return newRight;
如果有人可以指导我如何以不同的方式思考这个问题,我将不胜感激。我收到的输出要么使我的孩子的顺序不正确,要么覆盖了某些孩子,或者两者都覆盖了。
最佳答案
Robert Sedgwich的Algorithms Balanced Search Trees中讨论了使用四个节点来帮助进行拆分的技术。