数据结构基础5.4:堆(HEAP)的基本操作(插入与删除)

首先,先介绍一下堆的两个特性:

1. 结构性:用数组表示的完全二叉树

2. 有序性:任一结点的关键字是其子树所有结点的最大值(或最小值)

然后,我们正式开始介绍堆的基本操作,本文以最大堆为例,介绍了如下几个操作:

1. 创建一个空的最大堆

2. 判断最大堆是否满

3. 判断最大堆是否空

4. 将元素插入最大堆

5. 删除最大堆的最大元素并返回其值

具体完整代码如下:

#include 
#include 
#include 
#include 

#define ElemType int
#define Status int
#define OK 0
#define ERROR -1
#define MAX_VALUE 1000

using namespace std;

/* 由于堆的结构满足完全二叉树的形式,所以通过数组实现对堆的存储 */
typedef struct heap {
    ElemType* val;
    int size;
    int maxsize;
} *maxheap;

/* 判断堆是否满 */
int IsFull(maxheap mh)
{
    if(!mh)
        return ERROR;
    
    return (mh->size == mh->maxsize);
}

/* 判断堆是否空 */
int IsEmpty(maxheap mh)
{
    if(!mh)
        return ERROR;
    
    return (mh->size == 0);
}

/* 构造堆 */
maxheap CreateHeap(int maxlength)
{
    maxheap mh;
    
    if(!(mh = (maxheap)malloc(sizeof(struct heap))))
        exit(1);
    if(!(mh->val = (ElemType*)malloc((maxlength + 1) * sizeof(ElemType))))
        exit(1);
        
    /* 堆的元素值从val[1]开始计数,这里val[0]起到“哨兵”的作用,在插入函数中可以体现 */
    mh->val[0] = MAX_VALUE; 
    mh->size = 0;
    mh->maxsize = maxlength;
    
    return mh;
}

/* 在堆中插入元素并保持堆的有序性 */
Status InsertHeap(maxheap mh, ElemType n)
{
    int i;
    
    if(!mh)
        return ERROR;
        
    if(IsFull(mh)) {
        printf("The heap is full.\n");
        return ERROR;
    }
    
    /* 插入元素向上过滤 */
    mh->val[++mh->size] = n;
    for(i = mh->size; n > mh->val[i/2]; i = i/2)
        mh->val[i] = mh->val[i/2];
    mh->val[i] = n;
    
    return OK;
}

/* 在堆中删除最大值 */
ElemType DeleteHeap(maxheap mh)
{
    int parent, child, maxval, temp;
    
    if(!mh)
        return ERROR;
        
    if(IsEmpty(mh)) {
        printf("The heap is empty.\n");
        return ERROR;
    }
    
    maxval = mh->val[1];
    temp = mh->val[mh->size--];
    
    /* 堆中的最小元素向下过滤 */
    for(parent = 1; parent * 2 <= mh->size; parent = child) {
        child = parent * 2;
        if(child != mh->size && mh->val[child] < mh->val[child + 1])
            child++;
        /* 将子树的最大值与父结点值比较 */
        if(temp > mh->val[child])
            break;
        mh->val[parent] = mh->val[child];
    }
    mh->val[parent] = temp;
    
    return maxval;
}

/* 堆的遍历 */
Status TraverseHeap(maxheap mh)
{
    int i;
    
    if(!mh)
        return ERROR;    
        
    for(i = 1; i < mh->size + 1; i++)
        printf("%d ", mh->val[i]);
        
    printf("\n");
    
    return OK;
}

int main()
{
    int i;
    maxheap mh;
    
    mh = CreateHeap(10);
    
    for(i = 0; i < 10; i++)
        InsertHeap(mh, i);
    
    TraverseHeap(mh);
    
    for(i = 0; i < 5; i++)
        DeleteHeap(mh);    
    
    TraverseHeap(mh);
    
    while(1);
    return 0;
}


你可能感兴趣的:(Algorithm)