Appearance
题目
已知序列 25, 13, 10, 12, 9 是大根堆,在序列尾部插入新元素 18,将其再调整为大根堆,调整过程中元素之间进行的比较次数是()。
错因
A
只算了第一次比较(18 vs 父 10)就停。但 18 上升到位置 3 之后还要与新父(位置 1,值 25)再比一次才能确定停下,所以是 2 次而非 1 次。漏算"上升后还要再比新父"的隐含步骤。
C
把"插入后向上调整"和"删除堆顶后向下调整(sink)"搞混了。向下调整每层要"先比左右孩子选大者,再与父比",可能一层 2 次比较;但向上调整每层只与父比 1 次,没有兄弟之间的比较。
D
把堆大小(6)或层数当成比较次数估了。实际比较次数 ≤ 树高 = ,5 次显然超了。可能没真模拟过程,纯粹凭"插入会很费"瞎估。
总解析
原大根堆顺序数组(下标从 1 开始,对应完全二叉树):
| 下标 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 值 | 25 | 13 | 10 | 12 | 9 |
末尾插入 18 → 下标 6 = 18,对应位置:
25
/ \
13 10
/ \ /
12 9 18 ← 新插入向上调整(与父节点比较,大于父则交换上升,否则停止):
步骤 1:18(位置 6)vs 父 10(位置 3)。,比较 1 次,交换。
现在位置 3 = 18,位置 6 = 10。
步骤 2:18(位置 3)vs 父 25(位置 1)。,比较 1 次,停止上升。
合计 2 次比较。最终堆:
| 下标 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| 值 | 25 | 13 | 18 | 12 | 9 | 10 |
最终答案是 B。