微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Java中添加2-3-4树

如何解决在Java中添加2-3-4树

我正在制作一个程序,其中我使用2-3-4棵树在做字典。我有一个包含Node的树,每个节点可以包含1-3个键。我使用的算法是:

  1. 从树的根部开始。
  2. 如果找到不是叶子的节点,则它已满->拆分该节点。 (将节点拆分后,我们的cur节点将为cur = cur.getParent();cur = getNextChild(cur,k);),因此我们继续搜索叶节点以插入密钥。
    转到2。
  3. 如果到达叶节点->将密钥添加到该节点。
  4. 如果根是4节点->将其拆分。

getNextChild(Node n,Key k);搜索值期间获取了适当的节点子节点,因此我们可以到达正确的叶节点。

现在开始拆分:

  1. 我们要拆分的节点是一个内部节点(我们无需插入任何内容即可拆分它。)
    split(Node thisNode);移除了父级的中间键,创建了一个新节点作为当前的兄弟,并在其中添加了最大的键,而在当前保留了最小的键。

  2. 我们要拆分的节点是叶节点(我们需要插入一个新键,还要拆分该节点)。
    myOtherInsertKey(Key key); 拆分和插入的方式将是:

    1. 创建一个具有所有4个键的数组(节点中的3个键+将插入的1个键)。 Key[] keysArr = new Key[4];从最小到最大对数组进行排序。
    2. keysArr[0]将留在该节点中
      keysArr[1]将转到父节点
      keysArr[2]将转到新的兄弟节点
      keysArr[3]将转到新的兄弟节点

我的问题是:如何正确移动父级的子级,以便可以添加将作为子级创建的新节点,但不更改子级的原始顺序。如果我有一个3节点作为要插入另一个子节点的4节点的父节点,则已经有3个子节点(包括当前节点),并且在拆分并插入之后将有4个子节点。但是要插入到父级中的密钥可以放在任何索引中(它可以是所有密钥中最小的密钥,也可以是第二个最小的密钥,等等)。因此,要将新节点添加到父级的子级中,我必须保持子级的顺序并在正确的位置腾出空间,以便添加新的子级。

Node[] children = new Node[4];->如果节点只有2个或3个子节点,则rest会为空。

所以我为了与父母的孩子打交道是:

   public void myOtherInsertKey(Key key){
        // Assume that we have a full node and we want to insert key in that node
        // Sort keys and add them to parent/right brother
        int indexOfInsertedItem = parent.insertKey(toGoUp);  // at what index was the key inserted in parent
        int numOfParentKeys = parent.getNumKeys();           // how many keys has the parent have
        // move all children to the right
        for (int j = numOfParentKeys - 1; j > indexOfInsertedItem; j--){
            // disconnect each child and connect it to the next right index
            Node temp = parent.disconnectChild(j);
            parent.connectChild(j+1,temp);
        }
        // Now connect the node node that we created in the correct position in parent
        parent.connectChild(numOfParentKeys,newRight);
    }

这是一个执行示例:

test

因此,这里有些步骤是可以的,当我去插入“信标”时,孩子似乎消失或迷路了,显然我没有将他们正确地连接到父母。因此,我的错误应该出在那些我要在4节点中输入密钥的代码行中,以及在移动父母子女时,事情变得令人困惑。请如果您发现我做错了什么,或者对如何与那些孩子有更好的了解,将不胜感激。非常感谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。