二叉堆(Binary Heap)是一种基于完全二叉树实现的数据结构,能够高效维护集合中的最大值或最小值。其核心特性是插入、删除最值的操作时间复杂度均为 O(log n),而获取最值仅需 O(1),是优先队列、堆排序等算法的基石。
1、二叉堆的核心特性
1. 结构性质
- 完全二叉树:所有层除最后一层外均填满,最后一层从左到右填充。
- 数组表示:无需指针,通过索引计算父子节点:
- 父节点索引:parent(i) = (i-1) // 2
- 左子节点索引:left_child(i) = 2i + 1
- 右子节点索引:right_child(i) = 2i + 2
2. 堆序性质
- 最大堆:父节点值 ≥ 子节点值(维护最大值)。
- 最小堆:父节点值 ≤ 子节点值(维护最小值)。
2、完全二叉树与二叉堆的关系
1.完全二叉树
- 节点从上到下、从左到右连续填充,可用数组存储。
- 父节点索引
i
,左子节点索引2i
,右子节点索引2i+1
。
2.二叉堆
- 基于完全二叉树,分为大顶堆(父节点值 ≥ 子节点)和小顶堆(父节点值 ≤ 子节点)。
- 核心作用:动态维护集合中的最大值或最小值,时间复杂度为
O(log n)
。
3、堆的四种核心操作
1. 插入元素(Insert)
- 步骤:
- 将新元素插入数组末尾。
- 上浮(Sift Up):若新元素破坏堆序,则与其父节点交换,递归上浮至根。
- 时间复杂度:O(log n)。
- 代码示例(最大堆):
-
def insert(heap, value): heap.append(value) current = len(heap) - 1 while current > 0: parent = (current - 1) // 2 if heap[current] <= heap[parent]: break heap[current], heap[parent] = heap[parent], heap[current] current = parent
-
2. 删除最值(Extract)
- 步骤:
- 将堆顶元素(最值)与末尾元素交换并移除。
- 下沉(Sift Down):新堆顶与其较大子节点交换,递归下沉至叶子。
- 时间复杂度:O(log n)。
- 代码示例(最大堆):
-
def extract_max(heap): if not heap: re
-