说明:本文参考了启航25版本、竟成25版本、王道25版本、考研官方推荐教材、互联网资料以及结合个人的理解整理。本人水平有限,若有不对之处,烦请指正。
一 真题2009-9
- 已知关键字序列5,8,12,19,28,20,15,22 是小根堆(最小堆)插入关键字3,调整后得到的小根堆是()。
A. 3,5,12,8,28,20,15,22,19
B. 3,5,12,19,20,15,22,8,28
C. 3,8,12,5,20,15,22,28,19
D. 3,12,5,8,28,20,15,22,19
二 读题
本题考察小根堆的调整
三 哔哔详解
小根堆插入规则:首先新元素放入堆尾,然后不断向上调整(与父结点比较,若小于则交换,直至满足堆性质)。
第一步 确认原堆
5
/ \
8 12
/ \ / \
19 28 20 15
/
22
第二步 插入关键字3
5
/ \
8 12
/ \ / \
19 28 20 15
/ \
22 3 ← 新插入的 3
第三步向上调整:
- 当前节点:下标 8,值 = 3
- 父节点 :
(8 - 1) // 2 = 3,值 = 19
→ 3 < 19 → 交换
数组变为:[5, 8, 12, 3, 28, 20, 15, 22, 19]
树结构:
5
/ \
8 12
/ \ / \
3 28 20 15
/ \
22 19
- 当前节点:下标 3,值 = 3
- 父节点 :
(3 - 1) // 2 = 1,值 = 8
→ 3 < 8 → 交换
数组变为:[5, 3, 12, 8, 28, 20, 15, 22, 19]
树结构:
5
/ \
3 12
/ \ / \
8 28 20 15
/ \
22 19
- 当前节点:下标 1,值 = 3
- 父节点 :
(1 - 1) // 2 = 0,值 = 5
→ 3 < 5 → 交换
数组变为:[3, 5, 12, 8, 28, 20, 15, 22, 19]
树结构:
3 ← 根
/ \
5 12
/ \ / \
8 28 20 15
/ \
22 19
- 当前节点在根(下标 0),停止调整。
最终堆数组:[3, 5, 12, 8, 28, 20, 15, 22, 19] 故选 A
四 参考答案
参考答案 A
五 考点精析
5.1 堆的存储结构
- 堆是完全二叉树 ,用一维数组按层序(level order)存储
- 下标关系(从 0 开始):
- 父节点:
parent = (i - 1) // 2(整数除法,向下取整) - 左孩子:
left = 2i + 1 - 右孩子:
right = 2i + 2
- 父节点:
5.2 插入操作的调整
-
插入 → 向上调整(sift-up)
-
删除堆顶 → 向下调整(sift-down)
-
本题考的是插入 + 向上冒泡
5.3 小根堆性质
- 任意节点 ≤ 其子节点
- 不要求左右子树有序,只要求父子关系满足即可
- 数组中不是排序数组 !例如
[3,5,12,8,...]中 8 < 12,但 8 在左子树、12 在右子树,这是允许的。
六 考点追踪
暂 无