【问题标题】:Deletion of the leaf node from B-tree从 B-tree 中删除叶节点
【发布时间】:2017-03-13 03:04:19
【问题描述】:
从B树的叶子节点中删除节点的规则是什么。我在下面给出了一个例子。我需要从叶节点中删除键 J、K、U。 B 树的 't' 是 3。所以一个节点中的最小键数应该是 2。
J 可以毫无问题地删除。
但是当 J 被删除时,剩下的就是 K,L。接下来删除K的时候,由于节点包含2个节点,所以不能直接删除K。
由于它的兄弟节点 N,O 也包含它的最小节点,我应该在这里执行什么?是合并吗?
如何删除 K 和 U。
请帮忙。
【问题讨论】:
标签:
algorithm
data-structures
b-tree
【解决方案1】:
我参考了 Introduction-to-algorithms-第 3 版这本书 Thomas H Cormen,他解释得很好。
以下是包含所有案例的 3 个步骤。希望对您有所帮助。
如果键 k 在节点 x 中且 x 是叶子,则从 x 中删除键 k。
-
如果键 k 在节点 x 中并且 x 是内部节点,则执行以下操作:
一个。如果节点 x 中 k 之前的子 y 至少有 t 个键,则在以 y 为根的子树中找到 k 的前任 k'。递归删除k0,和
将 x 中的 k 替换为 k'。 (我们可以找到 k0 并在一个单一的向下删除它
通过。)
b.如果 y 有少于 t 个键,那么对称地检查子 z
在节点 x 中跟随 k。如果 z 至少有 t 个键,则在以 z 为根的子树中找到 k 的后继 k'。递归删除 k' ,并将 x 中的 k 替换为 k' 。 (我们
可以找到 k' 并在一次向下传递中将其删除。)
c。否则,如果 y 和 z 都只有 t-1 个键,则将 k 和所有 z 合并到 y 中,
因此 x 丢失了 k 和指向 z 的指针,并且 y 现在包含 2t-1 个键。
然后释放z并从y中递归删除k。
-
如果内部节点 x 中不存在密钥 k,则确定必须包含 k 的相应子树的根 x.ci,如果 k 完全在树中。如果 x.ci 只有 t-1 个键,则根据需要执行步骤 3a 或 3b,以保证我们下降到至少包含 t 个键的节点。然后通过递归 x 的适当子级来完成。
一个。如果 x.ci 只有 t-1 个键,但有一个直接兄弟至少有 t 个键,通过将一个键从 x 向下移动到 x.ci 来给 x.ci 一个额外的键,移动一个
键从 x.ci 的直接左或右兄弟向上进入 x,并移动
从同级到 x.ci 的适当子指针。
b.如果 x.ci 和 x.ci 的两个直接兄弟有 t-1 个键,则将 x.ci 与一个兄弟合并,这涉及将一个键从 x 向下移动到新的
合并节点成为该节点的中间键。