Skip to content

2011年 408 数据结构 第 11 题

数据结构2011年选择题2分

题目

已知序列 25, 13, 10, 12, 9 是大根堆,在序列尾部插入新元素 18,将其再调整为大根堆,调整过程中元素之间进行的比较次数是()。

错因

A

只算了第一次比较(18 vs 父 10)就停。但 18 上升到位置 3 之后还要与新父(位置 1,值 25)再比一次才能确定停下,所以是 2 次而非 1 次。漏算"上升后还要再比新父"的隐含步骤。

C

把"插入后向上调整"和"删除堆顶后向下调整(sink)"搞混了。向下调整每层要"先比左右孩子选大者,再与父比",可能一层 2 次比较;但向上调整每层只与父比 1 次,没有兄弟之间的比较。

D

把堆大小(6)或层数当成比较次数估了。实际比较次数 ≤ 树高 = ,5 次显然超了。可能没真模拟过程,纯粹凭"插入会很费"瞎估。

总解析

原大根堆顺序数组(下标从 1 开始,对应完全二叉树):

下标12345
251310129

末尾插入 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 次比较。最终堆:

下标123456
25131812910

最终答案是 B

最后更新:

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

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