----------------
该篇文章经提醒有一些错误,暂时没有时间修改,请勿参考。
该篇文章经提醒有一些错误,暂时没有时间修改,请勿参考。
----------------
堆是特殊的队列,从堆中取元素是按照元素的优先级大小,而不是元素进入队列的先后顺序。因此,堆也通常被称为“优先队列”。
堆的最常用结构是用二叉树表示,不特指的话,他是一棵完全二叉树。因此通常不必用指针,而是用数组来实现堆的存储。我们
知道,完全二叉树用数组来表示,就相当于把全完二叉树的层序遍历依次存入数组中,知道最后一个节点。
需要注意的是,所用的数组的起点为1,而不是0。这样的目的是很容易能够从父节点(i)找到子节点[ 2i ] [ 2i+1 ],反过来也很容易从子节点(j)找到父节点[ j/2 ]。
堆的特性:
用数组来表示完全二叉树是堆的第一特性:堆的结构特性。
任一节点的值与其子节点的值是相关的:部分有序性。
相关性的不同决定了两种不同的基本堆:最大堆(MaxHeap)(任一节点大于等于其子节点)和最小堆(MinHeap)(任一节点小于等于其子节点)。注意,兄弟节点之间没有约束关系。
当我们需要小键值优先时,使用最小堆;需要大键值优先时,使用最大堆。
首先来看一下堆的一般结构体实现:
typedef struct HNode * heap;//结构体指针
struct HNode{