一、核心认知
堆本质不是'树',而是数组 + 完全二叉树的映射关系。
完全二叉树的数组映射
- 父节点:
(i - 1) / 2 - 左孩子:
2 * i + 1 - 右孩子:
2 * i + 2
结构示意图
数组:[10, 8, 7, 3, 2]
10
/ \
8 7
/ \
3 2
二、核心操作本质
堆只做两件事:
| 操作 | 场景 | 本质 |
|---|---|---|
| 向上调整 | 插入 | 小往下,大往上 |
| 向下调整 | 删除 | 小往下沉,大往上顶 |
三、向上调整(AdjustUp)
使用场景
插入新元素。
核心思想
新节点不断和父节点比较,如果更大则上浮。
代码实现
void AdjustUp(int* a, int child) {
int parent = (child - 1) / 2;
while (child > 0) {
if (a[child] > a[parent]) {
Swap(&a[child], &a[parent]);
child = parent;
parent = (child - 1) / 2;
} else {
break;
}
}
}
关键点
- 只影响一条路径(O(log n))
parent写在外面是'初始化 + 更新'结构,更清晰


