2-3树 - 分裂困难

时间:2012-08-11 21:33:48

标签: java tree

我的任务是创建一个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;

如果有人可以帮我指导如何以不同的方式思考,我会很感激。我收到的输出要么是我的孩子的顺序不正确,要么是我覆盖了一些孩子或两者兼而有之。

1 个答案:

答案 0 :(得分:0)

Robert Sedgwich在Balanced Search Trees算法中讨论了使用四节点来帮助进行拆分的技术。