二叉堆 动机与特性分析 (2)

一颗高度为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; };

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyjjf.html