堆(Heap)和二叉堆(Binary Heap)是数据结构中用于高效实现优先级队列的两种重要概念。它们有着不同的特性和用途。以下是对这两者的详细解释:
堆(Heap)
-
定义:堆是一种特殊的完全二叉树,可以分为最大堆(Max-Heap)和最小堆(Min-Heap)。在最大堆中,每个节点的值都不小于其子节点的值;在最小堆中,每个节点的值都不大于其子节点的值。
-
特性:
- 完全二叉树:堆是一种完全二叉树,即所有层都被填满,除了可能的最后一层,且最后一层的节点都尽量靠左。
- 堆性质:最大堆中,每个节点的值大于或等于其子节点的值;最小堆中,每个节点的值小于或等于其子节点的值。
-
用途:堆通常用于实现优先级队列、堆排序等算法。
二叉堆(Binary Heap)
-
定义:二叉堆是一种基于二叉树的堆结构,是实现堆的最常见方式。它可以是最大堆或最小堆。
-
特性:
- 完全二叉树:二叉堆是一种完全二叉树,即除了最后一层之外,其他每一层都被完全填满。
- 堆性质:在最大二叉堆中,每个节点的值都大于或等于其子节点的值;在最小二叉堆中,每个节点的值都小于或等于其子节点的值。
-
实现:二叉堆通常使用数组来实现,数组中的索引与树结构的节点有以下关系:
- 对于索引为
i
的节点:- 左子节点的索引是
2*i + 1
- 右子节点的索引是
2*i + 2
- 父节点的索引是
(i - 1) // 2
- 左子节点的索引是
- 对于索引为
-
操作:
- 插入:将新元素添加到堆的末尾,然后通过"上浮"操作将其放置到正确的位置。
- 删除最大/最小元素:通常删除堆顶元素(最大堆中的最大值或最小堆中的最小值),将堆的最后一个元素放到堆顶,然后通过"下沉"操作重新调整堆。
- 堆化:将一个无序的数组转换成一个有效的堆。可以通过
build-heap
算法实现。