五个概念一层层嵌套,从抽象到具体,一文搞清楚它们的关系与区别
定义:一棵二叉树,除最后一层外每一层都被完全填满,且最后一层的节点从左到右连续排列。
定义:二叉堆 = 完全二叉树 + 堆序性(Heap Order Property)。
父节点 ≥ 子节点,根节点是最大值
父节点 ≤ 子节点,根节点是最小值
数组表示(以上面的大顶堆为例):
● 根节点(父) ● 内部节点(子) ● 叶子节点
定义:堆是一个满足堆序性的树形数据结构,不限制分支数量。
日常说的「堆」几乎总是指「二叉堆」,而「二叉堆」的底层就是一个「完全二叉树」用数组存的。大顶堆和小顶堆只是二叉堆的两种排序方向,互为「镜像」关系。
| 概念 | 性质 | 结构约束 | 顺序约束 | 常见用途 |
|---|---|---|---|---|
| 堆 | 抽象数据类型 | 无(树形即可) | 父与子满足大小关系 | 优先队列 |
| 二叉堆 | 堆的具体实现 | 完全二叉树 | 父 ≥ 子 或 父 ≤ 子 | 堆排序、优先队列 |
| 完全二叉树 | 树的结构分类 | 层满 + 从左填充 | 无 | 二叉堆的底层结构 |
| 大顶堆 | 二叉堆的一种 | 完全二叉树 | 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 是中序有序,堆只保证父子大小关系 |
| 「堆的左子树一定 ≥ 右子树」 | 不一定。堆序性只约束父子,不约束兄弟 |
| 「完全二叉树就是满二叉树」 | 不同:满二叉树每层都满;完全二叉树最后一层可以不满但必须从左填充 |