堆数据结构
提示
- 定义和类型:堆是一种满足特定堆属性的完全二叉树,可分为最大堆(父节点大于子节点)和最小堆(父节点小于子节点)。
- 基本操作:包括堆化(将二叉树转换为堆结构)、插入元素、删除元素以及提取最大或最小值。
- 堆的特点:堆化是创建最大或最小堆的关键步骤,涉及多次交换来保持堆属性;插入和删除操作后需重新堆化以维持堆结构。
堆数据结构是一种满足堆属性的完全二叉树,其中任何给定节点:
- 总是大于其子节点,并且根节点的键值是所有其他节点中最大的。这个属性也称为最大堆属性。
- 总是小于其子节点,并且根节点的键值是所有其他节点中最小的。这个属性也称为最小堆属性。
这种类型的数据结构也称为二叉堆。
堆操作
堆上执行的一些重要操作如下所述,以及它们的算法。
堆化(Heapify)
堆化是从二叉树创建堆数据结构的过程。它用于创建最小堆或最大堆。
-
让输入数组为
-
从数组创建一个完全二叉树
-
从索引为
n/2 - 1
的第一个非叶节点开始。 -
将当前元素
i
设置为最大
。 -
左子节点的索引为
2i + 1
,右子节点的索引为2i + 2
。 如果leftChild
大于currentElement
(即在第ith
索引处的元素),则将leftChildIndex
设置为largest
。 如果rightChild
大于largest
中的元素,则将rightChildIndex
设置为largest
。 -
交换
largest
和currentElement
。 -
重复步骤 3-7,直到子树也堆化。
算法
Heapify(array, size, i)
将 i 设置为 largest
左子节点 = 2i + 1
右子节点 = 2i + 2
如果左子节点大于 array[largest]
将左子节点索引设置为 largest
如果右子节点大于 array[largest]
将右子节点索引设置为 largest
交换 array[i] 和 array[largest]
要创建最大堆:
MaxHeap(array, size)
从第一个非叶节点的索引开始循环到零
调用堆化函数
对于最小堆,对所有节点来说,leftChild
和 rightChild
必须都大于父节点。