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

来源:互联网 发布:网络带给我们的坏处 编辑:程序博客网 时间:2024/06/05 02:00

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

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

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

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

1. 创建一个空的最大堆

2. 判断最大堆是否满

3. 判断最大堆是否空

4. 将元素插入最大堆

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

具体完整代码如下:

#include <stdio.h>#include <stdlib.h>#include <iostream>#include <malloc.h>#define ElemType int#define Status int#define OK 0#define ERROR -1#define MAX_VALUE 1000using 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;}


0 0