如果一棵完全二叉树的任意一个非终结点的元素都不小于其子结点,则此二叉树称为最大堆。
以下是最大堆的定义和一些基本操作(最小堆与之类似):
//堆的定义
typedef struct{
int elements[Maxsize];
int n;
}HEAP;
由于堆属于完全二叉树,因此可以方便的直接使用数组来表示。将堆的结点从根开始,自左而右,自上而下地进行编号,按照其顺寻保存在一个以为数组中即可,n为堆的结点数量。
//创建一个空堆
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);
}
在最大堆中插入数据时,需要在其数组最后添加数据,为了保持最大堆的性质,还需要将该数据与其父结点进行比较,如果大于父结点的值,则将其与父结点交换,并继续向上比较,直到该数据不大于其父结点或到达根结点为止。
//插入数据
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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。