Appearance
题目
已知关键字序列 28, 22, 20, 19, 8, 12, 15, 5 是大根堆(最大堆),对该堆进行两次删除操作后,得到的新堆是( )。
错因
A
把"删两次"当成"做两步堆排序最后整体排好",直接挑出剩 6 个元素并按降序排列:20、19、15、12、8、5。堆只要求"父 ≥ 孩子"的偏序,不要求层序看上去也是降序的全序——20, 19, 15, 5, 8, 12 同样是合法大根堆,但 5 必须留在原本"19 的左孩子"那个位置上,不能为了"看着顺"被换到末尾。
C
第一次删除做对了,第二次下沉 15 时方向选错。15 在根,左孩子 19、右孩子 20,应与较大的 20 交换;选 C 的人换成了与左孩子比较或挑了较小的孩子,让 12 跑到了 15 应该到的位置。结果序列里 12 和 15 错位、5 被挤出原位置。
D
删除时没用"末尾元素替换根 + 下沉"的标准做法,而是采用"孩子轮流上提"的错误流程——删 28 时直接把较大孩子 22 提上来,22 的位置再让 19 提上来……这种上提法会破坏右子树和最深叶子的相对位置,得到结构散乱、节点错位的"堆"。
总解析
大根堆 deleteMax 的标准两步:
- 把堆中最后一个元素搬到根(保持完全二叉树形态)。
- 从根开始下沉:与最大孩子比较,若小于则交换,重复直到大于等于所有孩子或到叶子。
初始堆(28, 22, 20, 19, 8, 12, 15, 5):
第一次 deleteMax(删 28):
末尾元素 5 上移到根,剩 7 个元素:[5, 22, 20, 19, 8, 12, 15]。下沉 5:
- 与 比,5 < 22,交换 → [22, 5, 20, 19, 8, 12, 15]
- 5 现在 idx=2,与 比,5 < 19,交换 → [22, 19, 20, 5, 8, 12, 15]
- 5 现在 idx=4,已是叶子,停止。
第二次 deleteMax(删 22):
末尾元素 15 上移到根,剩 6 个元素:[15, 19, 20, 5, 8, 12]。下沉 15:
- 与 比,15 < 20,交换 → [20, 19, 15, 5, 8, 12]
- 15 现在 idx=3,唯一孩子 12(idx=6),15 > 12,停止。
按层序写出新堆序列:20, 19, 15, 5, 8, 12。
最终答案是 B。