Appearance
题目
已知关键字序列 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 开始):
| 下标 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|
| 值 | 5 | 8 | 12 | 19 | 28 | 20 | 15 | 22 |
插入 3 放到下标 9(父节点为 ⌊9/2⌋=4,即 19):
数组:[5, 8, 12, 19, 28, 20, 15, 22, 3]
向上调整(sift up):
- 下标 9 的值 3 < 父节点(下标 4)的值 19 → 交换 → [5, 8, 12, 3, 28, 20, 15, 22, 19]
- 下标 4 的值 3 < 父节点(下标 2)的值 8 → 交换 → [5, 3, 12, 8, 28, 20, 15, 22, 19]
- 下标 2 的值 3 < 父节点(下标 1)的值 5 → 交换 → [3, 5, 12, 8, 28, 20, 15, 22, 19]
- 已到根,停止。
最终堆:3, 5, 12, 8, 28, 20, 15, 22, 19,答案 A。