Skip to content

2009年 408 数据结构 第 9 题

数据结构2009年选择题2分

题目

已知关键字序列 5,8,12,19,28,20,15,22 是小根堆(最小堆),插入关键字 3,调整后得到的小根堆是()。

错因

B

向上调整的方向走错——把"插到末尾后向上 sift"做成了"从根 sift down",沿大数往小数走,结果像是把整棵树重新堆化了一遍。表现就是末段乱、首段还在 3, 5, 12 看着对,正是 B 选项的特征。错因是混淆了"插入"和"删除堆顶后的调整"——前者向上比父,后者向下比孩子。

C

把新节点 3 插在了错误的位置(比如以为是第 2 号节点 8 的左孩子而不是第 4 号节点 19 的左孩子),向上调整起点不对,交换路径也就完全错了。

D

向上调整只做了一步或两步就停下了,没有一直调整到根,以为 3 < 12(某中间节点)就可以停止,实际上还需要继续和更上层的 8、5 比较交换。

总解析

初始小根堆(数组下标从 1 开始):

下标12345678
58121928201522

插入 3 放到下标 9(父节点为 ⌊9/2⌋=4,即 19):

数组:[5, 8, 12, 19, 28, 20, 15, 22, 3]

向上调整(sift up):

  1. 下标 9 的值 3 < 父节点(下标 4)的值 19 → 交换 → [5, 8, 12, 3, 28, 20, 15, 22, 19]
  2. 下标 4 的值 3 < 父节点(下标 2)的值 8 → 交换 → [5, 3, 12, 8, 28, 20, 15, 22, 19]
  3. 下标 2 的值 3 < 父节点(下标 1)的值 5 → 交换 → [3, 5, 12, 8, 28, 20, 15, 22, 19]
  4. 已到根,停止。

最终堆:3, 5, 12, 8, 28, 20, 15, 22, 19,答案 A

最后更新:

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

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