【问题标题】:insert Btree with parents pointers插入带有父指针的 Btree
【发布时间】:2018-11-12 07:17:20
【问题描述】:

我尝试在 Java 中为 Btree 编写插入代码,但无法正确拆分节点,谁能指导我在 Btree 中插入、拆分和 nonfullInset 的良好算法?

谢谢

【问题讨论】:

    标签: java insert b-tree


    【解决方案1】:

    假设每个节点:

    • 最大的孩子数是 D,
    • 最大键数为 K= D-1,
    • 最小的孩子数是 d = D/2,
    • 最小键数为 k= D/2-1

    这里是算法:

    • 插入:搜索树以找到包含键的叶节点。插入钥匙。查看key是否溢出(key的个数大于D-1),如果没有则操作完成。如果溢出,将节点拆分为 2 个节点(自身和一个新节点),将最后 (k) 个键移动到新节点,留下具有 k +1 个键的节点(叶节点)。将叶节点中的最后一个键移动到父节点。如果父级溢出,请重复这些步骤。

    • 删除:搜索树以找到包含要删除的键的节点。 2种情况是可能的。容器节点是叶节点或者是内部非叶节点。如果是内部节点,首先在节点 中找到该键的直接前驱,它总是来自一个前导节点。然后用这个前任密钥替换密钥。现在您需要从叶节点中删除密钥。 (请注意,从内部节点删除总是简化为从叶节点删除)。如果是叶节点,则从叶节点中删除键。检查叶节点是否处于飞行状态(具有少于 k 个键),如果没有,则操作完成。但是,如果飞行不足,则可能有 3 种情况。如果节点的左兄弟节点至少有 k+1 个键,则通过父节点执行右旋转。否则,如果该节点有一个至少有 k+1 个键的右兄弟,则通过父节点执行左旋转。否则,如果该节点没有任何具有至少 k+1 个键的兄弟节点,则将该节点与其兄弟节点之一连接,同时从父节点中删除一个键。然后检查parent是否下飞,如果下飞重复这些步骤来修复父母。

    • Search:类似于二叉搜索树,主要区别在于现在你还需要在每个节点中执行一个搜索,因为每个节点都有排序的键,你可以执行对每个节点进行二分搜索。

    【讨论】:

      猜你喜欢
      • 2015-11-23
      • 1970-01-01
      • 2014-09-19
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多