最大堆的一些基本操做

若是一棵彻底二叉树的任意一个非终结点的元素都不小于其子结点,则此二叉树称为最大堆。数组

如下是最大堆的定义和一些基本操做(最小堆与之相似):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;
}
相关文章
相关标签/搜索