📅  最后修改于: 2021-01-12 03:37:57             🧑  作者: Mango
堆有几种类型,但是在本章中,我们将讨论二进制堆。二进制堆是一种数据结构,看起来类似于完整的二进制树。堆数据结构遵循下面讨论的排序属性。通常,堆由数组表示。在本章中,我们用H表示堆。
由于堆的元素存储在数组中,因此将起始索引视为1 ,则可以在element i / 2处找到第i个元素的父节点的位置。第i个节点的左子节点和右子节点位于2i和2i +1位置。
根据排序属性,二进制堆可以进一步分为最大堆或最小堆。
在此堆中,节点的键值大于或等于最高子级的键值。
因此, H [Parent(i)]≥H [i]
在均值堆中,节点的键值小于或等于最低子级的键值。
因此, H [Parent(i)]≤H [i]
在这种情况下,以下是有关Max-Heap的基本操作。元素在堆中的插入和删除需要元素的重新排列。因此,需要调用Heapify函数。
完整的二叉树可以由数组表示,并使用级别顺序遍历存储其元素。
让我们考虑一个将由数组H表示的堆(如下所示)。
考虑到起始索引为0 ,使用级别顺序遍历,将元素按以下方式保存在数组中。
Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | … |
elements | 70 | 30 | 50 | 12 | 20 | 35 | 25 | 4 | 8 | … |
在这种情况下,相对于Max-Heap表示堆上的操作。
为了找到索引i处元素的父级的索引,使用以下算法Parent(numbers [],i) 。
Algorithm: Parent (numbers[], i)
if i == 1
return NULL
else
[i / 2]
可以使用以下算法Left-Child(numbers [],i)找到索引i处元素的左子元素的索引。
Algorithm: Left-Child (numbers[], i)
If 2 * i ≤ heapsize
return [2 * i]
else
return NULL
可以使用以下算法Right-Child(numbers [],i)找到索引i处元素的右子元素的索引。
Algorithm: Right-Child (numbers[], i)
if 2 * i < heapsize
return [2 * i + 1]
else
return NULL