我正在研究B树,在书中他们说:
如果密钥k在节点x中且x是叶子,则从x中删除密钥k。
如果密钥k在节点x中且x是内部节点,请执行以下操作。
一个。如果节点x中位于k之前的子y具有至少t个密钥,则在以y为根的子树中找到k的前驱k'。递归删除k',并用x替换k'。 (找到k'并删除它可以在一次向下传递中执行。)
湾对称地,如果在节点x中跟随k的子z具有至少t个密钥,则在以z为根的子树中找到k的后继k'。递归删除k',并用x替换k'。 (找到k'并删除它可以在一次向下传递中执行。)
℃。否则,如果y和z都只有t-1个键,则将k和z的所有z合并为y,这样x会丢失k和指向z的指针,而y现在包含2t - 1个键。然后,释放z并递归地从y中删除k。
我的问题是:如果是2.a. 有人可以用例子解释我:递归删除k',并用x中的k'替换k。
问候。
答案 0 :(得分:1)
假设您有b树,其度数为t = 4:
26, 49, 60
27,31,34,36 51,55,56,58
假设y = [27,31,34,36]
,x = [51,55,56,58]
不是叶节点,而您想删除密钥k = 51
。让K = 49
成为分割x
和y
的父节点中的密钥。
找到k
的前身,它是子树k'
中最右边的键y
(在此示例中可能包含37到48之间的整数,比如k' = 40
) 。设置k = K = 49
和K = k' = 40
并递归删除k'
(这实际上是节点为leaf时删除过程的第一种情况)。生成的b树看起来像
26, 40, 60
27,31,34,36 49,55,56,58