数据结构基础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
- 数据结构基础5.4:堆(HEAP)的基本操作(插入与删除)
- 数据结构基础5.2:二叉搜索树(BST)的基本操作(插入、查找、删除)
- 【数据结构】最大堆的插入与删除
- 【数据结构】堆(heap)
- 数据结构-堆(heap)
- 【数据结构】堆(heap)
- 数据结构-堆(Heap)
- 数据结构-堆(heap)
- 数据结构:堆(heap)
- 【数据结构基础】最大堆的基本操作
- java实现堆的操作(建堆,插入,删除)
- 数据结构之堆(Heap)的实现
- 写给初学数据结构的同学之(循环双链表基本操作,创建,插入,删除,排序)
- 数据结构:链表的基本操作(创建,删除,插入,逆序,摧毁)
- 二叉搜索树的基本操作(查找、插入、删除)【数据结构】
- 数据结构之 单链表的基本操作(创建、取值、插入、删除)
- 最大堆的初始化、删除、插入等基本操作
- 堆的基本操作:定义、创建、插入、删除、排序
- Java内存与垃圾回收
- 杭电ACM1114(完全背包)
- 明天面试,大前天离职
- How Many Tables
- OpenGL_Qt学习笔记之_05(纹理映射)
- 数据结构基础5.4:堆(HEAP)的基本操作(插入与删除)
- leetcode:Pascal's Triangle II
- Object—C基础第一课
- hdu 5343 MZL's Circle Zhou(后缀自动机)
- OpenGL_Qt学习笔记之_06(纹理滤波、光照和色彩融合)
- muduo库阅读(14)——倒数计数器
- OpenGL_Qt学习笔记之_07(闪烁的星星)
- iOS --- 使用UIActivityViewController实现分享功能
- 5,计算机存储单位转换