基于Korth《数据库系统概念》的B+树删除伪代码执行疑问
阶为5的B+树删除操作拆解(基于Korth《数据库系统概念》伪代码)
嘿,咱们结合Korth《数据库系统概念》里的B+树删除伪代码,一步步理清楚这个场景的操作流程:
先明确初始状态
我们操作的是阶为5的B+树,当前处于第2层(内部节点层),初始的内部节点结构是:
- 根节点:
[7.0] - 根节点的两个子节点(第2层):
[3.0, 5.0]和[9.0, 11.0, 13.0] - 这两个第2层节点下方连接着叶子节点
现在执行的是删除函数:delete_entry([3.0, 5.0], 3.0, 子节点指针)
第一步:删除后的节点状态
把[3.0,5.0]里的3.0删掉后,这个节点就只剩下[5.0]了。此时第2层的内部节点变成:
- 节点X:
[5.0](原[3.0,5.0]删除后的剩余节点) - 节点Y:
[9.0,11.0,13.0](相邻兄弟节点)
第二步:触发合并条件(对应伪代码第一个if判断)
根据Korth书中的伪代码逻辑,第一个核心if判断会检查:当前节点的键数低于最小要求,且和相邻兄弟节点合并后(加上父节点的分隔键)不会超过节点的最大键数限制。
对于阶为5的B+树:
- 内部节点的最小键数要求是
⌈5/2⌉ - 1 = 2(因为阶m的B+树,内部节点最少要有⌈m/2⌉个子节点,对应键数是子节点数-1) - 节点X现在只有1个键,明显低于最小值,触发后续检查
- 相邻兄弟节点Y有3个键,加上父节点的分隔键
7.0,总键数合并后符合最大限制,满足合并条件
满足条件后,执行以下操作:
- 把父节点(根节点
[7.0])里的分隔键7.0移除,并入到待合并的节点中 - 合并节点X、分隔键
7.0和节点Y,得到新的内部节点:[5.0,7.0,9.0,11.0,13.0] - 删除原来的节点X和Y,把合并后的新节点挂到父节点下
- 此时父节点(原根节点
[7.0])因为移除了唯一的键,变成了空节点。由于它是根节点,直接把合并后的新节点设为新的根节点,树的高度也从3层变成了2层。
核心要点总结
- 阶为5的B+树,内部节点的键数范围是
2~4(标准定义),删除后节点键数低于下限就需要调整:优先尝试向兄弟节点借键,借键不可行时触发合并操作 - 合并操作必须拉父节点的分隔键参与,同时会导致父节点的键数减少,需要递归检查父节点是否还满足要求,直到根节点
内容的提问来源于stack exchange,提问作者James Shaw




