Appearance
题目
在下图所示的 5 阶 B 树 T 中,删除关键字 260 之后需要进行必要的调整,得到新的 B 树 T1。下列选项中,不可能是 T1 根结点中关键字序列的是( )。

结构(文字版):5 阶 B 树(每个非根非叶结点 keys 数 ∈ [2, 4],孩子数 ∈ [3, 5];根结点 keys 数 ∈ [1, 4])。
- 根:
[60, 90, 260, 350](4 个 key,5 个孩子)- 5 个叶子从左到右:
- C1 =
[30, 50]- C2 =
[70, 80, 85]- C3 =
[100, 110]- C4 =
[280, 300]- C5 =
[400, 500]子树边界关系:60 < C2 < 90 < C3 < 260 < C4 < 350 < C5。
错因
A
A 的根 [60, 90, 280] 是合法情形之一:用后继 280 替换 260,C4 因失去 280 变成 [300](下溢,仅 1 个 key < 最少 2 个)。左兄 C3=[100,110] 与右兄 C5=[400,500] 都只有 2 个 key,不能借出,只能与右兄 C5 合并:把根中分隔符 350 拉下来,与 [300] 和 [400,500] 合并成新结点 [300,350,400,500](4 个 key 不溢出)。根少了一个 key 350,变为 [60, 90, 280]。所以 A 是可能的。选 A 当作"不可能",是没穷举完合并方向。
B
B 的根 [60, 90, 350] 也是合法情形之一。可以从两条路径达到:
- 用前驱 110 替换 260,根暂变
[60, 90, 110, 350],C3 变[100]下溢;左兄 C2=[70,80,85]共 3 个 key,与 C3=[100]合并需 3+1+1(分隔符 90)=5 个 key 超 4 不可行。改用与右兄合并:拉下分隔符 110,把 C3=[100]与 C4=[280,300]合成[100,110,280,300],根少 110 变[60, 90, 350]。 - 用后继 280 替换 260,C4 变
[300]下溢,与左兄 C3=[100,110]合并:拉下分隔符 280,新结点[100,110,280,300],根少 280 变[60, 90, 350]。
所以 B 可能。选 B 的人可能只考虑了一种调整路径。
C
C 的根 [60, 85, 110, 350] 是合法情形之一:用前驱 110 替换 260,C3 变 [100] 下溢;从左兄 C2=[70, 80, 85](有 3 个 key 可借)借调——把根中分隔符 90 下降到 C3 左端,C2 的最大 key 85 升上去当新分隔符。结果 C2=[70, 80]、C3=[90, 100],根=[60, 85, 110, 350]。所以 C 可能。
总解析
思路:删除内部 key 260,标准做法是用 C3 的最大 key(前驱 110)或 C4 的最小 key(后继 280)替换;替换后底层叶子可能下溢(key 数 < 最少 2),需借/合并修复。穷举所有合法调整路径,能产生的根序列就是"可能"的,剩下的就是答案。
两种替换 × 多种修复路径:
| 路径 | 操作 | 调整后根 |
|---|---|---|
| ① 前驱 110 替换 + 从 C2 借 85 | 借调(C2 富余) | [60, **85**, 110, 350] → C |
| ② 前驱 110 替换 + 与右兄 C4 合并 | 合并(左不能借/合) | [60, 90, 350] → B |
| ③ 后继 280 替换 + 与左兄 C3 合并 | 合并(左右兄都不能借) | [60, 90, 350] → B(同上) |
| ④ 后继 280 替换 + 与右兄 C5 合并 | 合并 | [60, 90, 280] → A |
注:路径 ① 中也可考虑"前驱 110 替换 + 与左兄 C2 合并",但 C2(3 keys) + C3(1 key) + 分隔符 90 = 5 个 key,超过 5 阶 B 树的上限 4,不可行,不会产生新根。
为什么 D [60, 90, 110, 350] 不可能?
[60, 90, 110, 350] 正好是用前驱 110 简单替换 260 后、还没修复 C3 下溢的中间状态。C3 此时只剩 [100](1 个 key),违反 5 阶 B 树非根结点 keys ≥ 2 的规则——题目要求"必要的调整后"得到合法的 T1,所以这个中间形态绝不能作为 T1 的根。
最终答案是 D。