一颗高度为h的CBT有$2^{h}$到$2^{h+1}\; -\; 1$个节点,这就意味着CBT的高度是$\left\lfloor \log N \right\rfloor$。之前说物理上可以用数组实现是因为,CBT很有规律,可以用一个数组表示而不用指针。下图的数组对应图6.2中的堆
对于每一个位置为i的元素,左孩子在$2i$上,右孩子在$2i\; +\; 1$的位置,父亲则在$\left\lfloor \frac{i}{2} \right\rfloor$上,所以不用指针就可以按下标访问。这种方法的唯一问题在于我们要事先估计堆的规模,从而确定开多大空间,不过这个也好解决。因此,堆这种结构将由一个数组、代表最大值的数、指示当前堆的最大规模的数字组成。下面先给出相关类型声明
#ifndef BinHeap_h #define BinHeap_h struct HeapStruct; typedef struct HeapStruct *PriorityQueue; PriorityQueue Init(int maxValue); void Insert(int X,PriorityQueue H); int Delete(PriorityQueue H); void PercolateDown(int *a,int root,int size); void Display(PriorityQueue H); void BuildHeap(int N,PriorityQueue H); #endif /* BinHeap_h */ struct HeapStruct { int capacity; //总空间 int size; //已有元素的规模 int *Element; };