若是一棵彻底二叉树的任意一个非终结点的元素都不小于其子结点,则此二叉树称为最大堆。数组
如下是最大堆的定义和一些基本操做(最小堆与之相似):code
//堆的定义 typedef struct{ int elements[Maxsize]; int n; }HEAP;
因为堆属于彻底二叉树,所以能够方便的直接使用数组来表示。将堆的结点从根开始,自左而右,自上而下地进行编号,按照其顺寻保存在一个觉得数组中便可,n为堆的结点数量。element
//建立一个空堆 void MaxHeap(HEAP heap) { heap.n=0; } //判断堆是否为空 bool HeapEmpty(HEAP heap) { if(heap.n == 0) return true; else return false; } //判断堆是否为空 bool HeapFull(HEAP heap) { return (heap.n==Maxsize-1); }
在最大堆中插入数据时,须要在其数组最后添加数据,为了保持最大堆的性质,还须要将该数据与其父结点进行比较,若是大于父结点的值,则将其与父结点交换,并继续向上比较,直到该数据不大于其父结点或到达根结点为止。ast
//插入数据 void Insert(HEAP heap, int element) { int i; if(!HeapFull(heap)) { i=heap.n+1; while((i!=1) && (element>heap.elements[i/2])) { heap.elements[i] = heap.elements[i/2]; i/=2; } heap.elements[i]=element; } else { cout<<"该堆已满!"<<endl; } }
删除堆中的最大元素时必定是删除堆的根结点。为了保持其性质,咱们将最后一个结点一直根结点中,而后比较结点i与其较大子结点的元素,若是小于较大子结点的元素,则进行交换,并令这个子结点成为新的结点i继续向下比较。二叉树
void DeleteMax(HEAP &heap) { int parent = 1, child = 2; if(!HeapEmpty(heap)) { int last = heap.n - 1; heap.elements[1]=heap.elements[last]; while(child < heap.n) { if(heap.elements[child] < heap.elements[child+1]) child++; if(heap.elements[parent] < heap.elements[child]) { int temp = heap.elements[parent]; heap.elements[parent]=heap.elements[child]; heap.elements[child]=temp; } parent = child; child *= 2; } } else cout<<"该堆为空!"<<endl; }
查找元素是否在堆中:数据
//查找某个元素是否在堆中,若在则返回其位置,不在则返回0 int Find(HEAP heap, int e, int start) { int n = start; while(n < heap.n) { if(heap.elements[n] == e) return n; else { if(heap.elements[2*n] < e) n = 2*n + 1; else if (heap.elements[2*n] != e) n++; else if(heap.elements[2*n] == e) return 2*n; } } return 0; }