堆 · 二叉堆 · 完全二叉树 · 大顶堆 · 小顶堆

五个概念一层层嵌套,从抽象到具体,一文搞清楚它们的关系与区别

🔷 概念关系总览(从大到小)

🧱 堆(Heap)
最抽象的概念
🌳 二叉堆(Binary Heap)
最常用的堆实现
╰── 依赖 ──▶
📋 完全二叉树(Complete Binary Tree)
底层数据结构
🔴 大顶堆(Max Heap)
父 ≥ 子
兄弟关系,互斥
🟢 小顶堆(Min Heap)
父 ≤ 子
完全二叉树是结构约束,大/小顶堆是顺序约束
二叉堆 = 完全二叉树 + 大顶堆(或小顶堆)的顺序规则。

1. 完全二叉树(Complete Binary Tree) 结构约束

定义:一棵二叉树,除最后一层外每一层都被完全填满,且最后一层的节点从左到右连续排列

✅ 完全二叉树

1 2 3 4 5 6 7

❌ 非完全二叉树(右子树缺左)

1 2 3 6 ← 跳过了左子节点 4、5

2. 二叉堆(Binary Heap) 结构 + 顺序

定义:二叉堆 = 完全二叉树 + 堆序性(Heap Order Property)。

数组存储公式(下标从 0 开始):
父节点下标:parent(i) = ⌊(i-1)/2⌋
左子节点:left(i) = 2i + 1  右子节点:right(i) = 2i + 2

🔴 大顶堆(Max Heap)

父节点 ≥ 子节点,根节点是最大值

50 30 20 15 10 8 7 50 ≥ 30, 20 | 30 ≥ 15, 10 | 20 ≥ 8, 7

🟢 小顶堆(Min Heap)

父节点 ≤ 子节点,根节点是最小值

7 20 30 50 40 35 32 7 ≤ 20, 30 | 20 ≤ 50, 40 | 30 ≤ 35, 32

数组表示(以上面的大顶堆为例):

50[0]
30[1]
20[2]
15[3]
10[4]
8[5]
7[6]

根节点(父)   内部节点(子)   叶子节点

3. 堆(Heap)— 最抽象的概念 抽象数据类型

定义:堆是一个满足堆序性的树形数据结构,不限制分支数量。

💡 一句话总结关系

日常说的「堆」几乎总是指「二叉堆」,而「二叉堆」的底层就是一个「完全二叉树」用数组存的。大顶堆和小顶堆只是二叉堆的两种排序方向,互为「镜像」关系。

📊 五者核心区别对比

概念 性质 结构约束 顺序约束 常见用途
抽象数据类型 无(树形即可) 父与子满足大小关系 优先队列
二叉堆 堆的具体实现 完全二叉树 父 ≥ 子 或 父 ≤ 子 堆排序、优先队列
完全二叉树 树的结构分类 层满 + 从左填充 二叉堆的底层结构
大顶堆 二叉堆的一种 完全二叉树 parent ≥ child 找最大值(如调度器)
小顶堆 二叉堆的一种 完全二叉树 parent ≤ child 找最小值(如Dijkstra)

⏱ 二叉堆关键操作复杂度

操作 时间复杂度 说明
取顶(查看根) O(1) 数组第一个元素即为极值
插入 O(log n) 末尾追加 → 上浮(sift up)
删除堆顶 O(log n) 末尾换到根 → 下沉(sift down)
建堆 O(n) 从最后一个非叶节点逐个下沉
堆排序 O(n log n) 原地排序,不稳定

🎯 最后的澄清:常见误区

误区 真相
「堆是一个有序数组」 不是有序数组。只保证根是极值,左右子树没有全局有序性
「BST(二叉搜索树)和堆一样」 不同:BST 是中序有序,堆只保证父子大小关系
「堆的左子树一定 ≥ 右子树」 不一定。堆序性只约束父子,不约束兄弟
「完全二叉树就是满二叉树」 不同:满二叉树每层都满;完全二叉树最后一层可以不满但必须从左填充