一、堆的定义:
一个(二叉)堆是一个几乎完全二叉树,它的每个节点都有满足堆的每个特性:如果v和p(v)分别是它的节点和父节点,那么存储在p(v)中的数据项中的键值不小于(或不大于)存储在v中的数据项的键值。
堆的数据结构支持以下运算:
Delete-max[h]:从一个非空的推H中删除最大键值的数据项并将数据项返回。
Insert[h,x]:插入x到堆中。
Delete[h,i]:从堆中删除第i项
Makehaep[A]:将数组A转换成堆
这个堆的特性蕴含着:沿着每条从根到叶子的路径,元素的健值以非升序排列:
a.T的根节点存储在H[1]中。
b.假设T的节点存储在H[j]中,如果它有左子节点,这个子节点存储在H[2j]中,如果它也有右节点,这个子节点存储在H[2j+1]中。
c.元素H[j]的父节点如果不是根节点,则存储在H[j/2]中。
堆可以看以一棵完全二叉树,它实际上是一个数组H[1..N]。它有如下性质:对于任何索引j,2<=j<=N,
,如下图: