Skip to content

2012年 408 数据结构 第 9 题

数据结构2012年选择题2分

题目

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

2012 真题第 9 题:3 阶 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 下移

具体:

  1. 父节点 [55, 65] 中"夹在左兄弟和当前节点之间的分隔 key" 是 65——它下移到当前空节点
  2. 左兄弟 [60, 62] 的最右 key 62——它上移到父节点填补 65 留下的空位

步骤 4:最终结构

节点
[45]
第二层[17, 35][55, 62]
叶子层(自左向右)[10], [21], [37], [47], [60], [65]

最右叶节点是 [65],里面只有关键字 65

借位记忆口诀:父分隔 key ↓ 当前节点,兄弟最靠近父的 key ↑ 父。左兄弟出 最右,右兄弟出 最左——选的都是最贴近父分隔点的那个 key,保证排序仍合法。

最终答案是 D

最后更新:

🎬 可视化演示
加载中...

提示:可在可视化区直接操作播放、步进、修改参数