Appearance
题目
已知一棵 3 阶 B 树,如下图所示。删除关键字 78 得到一棵新 B 树,其最右叶结点中的关键字是()。

B 树结构:3 阶 B 树(每节点最多 2 个 key、孩子最多 3 个;非根节点 key 数 ≥ 1)。
层 节点 根 [45]第二层 [17, 35]、[55, 65]叶子层(自左向右) [10]、[21]、[37]、[47]、[60, 62]、[78]
错因
A
把"借哪个 key"记反了。借位的规则是借靠近父分隔点的 key——左兄弟借出最右 key(最大的,紧邻父分隔点),不是最左。左兄弟 [60, 62] 应该借 62 而非 60。
B
把"借位"和"合并"搞混了。触发合并的条件是兄弟节点 key 数已经到下限(3 阶 B 树就是只剩 1 个),借不出来。本题左兄弟 [60, 62] 有 2 个 key,借 1 个还剩 1 满足下限——应该借不应该合并。
如果误用合并:把当前空节点和左兄弟以及父分隔 key 65 合并成 [60, 62, 65]——但这又超过 3 阶 B 树上限 2 个 key,逻辑也不通。
C
把借位的两个动作搞混了。借位是"两个 key 同时移动":父分隔 key 下移到当前节点,兄弟最近 key 上移到父——但选 C 的人把上移和下移的 key 塞到同一个叶节点。
正确的最终状态:父变 [55, 62],左兄弟变 [60],当前叶节点是 [65](不是 [62, 65])。
总解析
3 阶 B 树性质回顾:
- 每节点最多 个 key(也叫 2-3 树)
- 非根节点至少 个 key
- 删除时如果某节点 key 数掉到 0,必须借或合并来修复
删除 78 的逐步操作:
步骤 1:定位并删除
78 在最右叶 [78],直接删,节点变成空 []。此时该节点 key 数 = 0,违反约束,需调整。
步骤 2:判断借位 or 合并
检查兄弟节点:
- 右兄弟:无(已是父的最右孩子)
- 左兄弟
[60, 62]:有 2 个 key,借 1 个还剩 1,满足下限——优先借位(合并是借不出来时才用)
步骤 3:执行借位(左借 / right rotation)
借位的"key 流动"图示:
[55, 65] [55, 62]
/ | \ / | \
... [60,62] [] ... [60] [65]
↑ ↑ ↑
借这棵的最右 62 62 上移 65 下移具体:
- 父节点
[55, 65]中"夹在左兄弟和当前节点之间的分隔 key" 是 65——它下移到当前空节点 - 左兄弟
[60, 62]的最右 key 62——它上移到父节点填补 65 留下的空位
步骤 4:最终结构
| 层 | 节点 |
|---|---|
| 根 | [45] |
| 第二层 | [17, 35]、[55, 62] |
| 叶子层(自左向右) | [10], [21], [37], [47], [60], [65] |
最右叶节点是 [65],里面只有关键字 65。
借位记忆口诀:父分隔 key ↓ 当前节点,兄弟最靠近父的 key ↑ 父。左兄弟出 最右,右兄弟出 最左——选的都是最贴近父分隔点的那个 key,保证排序仍合法。
最终答案是 D。