定义:

最大堆和最小堆都是一棵完全二叉树。

最大堆:是指根节点的关键字值是堆中的最大关键字值,且每个节点若有儿子节点,其关键字值都不小于其儿子节点的关键字值。

最小堆:是指根节点的关键字值是堆中的最小关键字值,且每个节点若有儿子节点,其关键字值都不大于其儿子节点的关键字值。

以下的操作以最大堆为例,最小堆相似。

最大堆的插入操作

步骤:

  1. 把待增加的节点编号 i 设置为已知堆的总节点数加 1 即 i=++(*n),因此,新增的元素放在最下一层作为新的叶子节点。求出节点 i 的父节点 parent=i/2; 判断是否为空堆,并比较所插入元素与父节点关键字值的大小;
  2. 若所插入节点关键字值大于父节点关键字值即item>heap[parent],则把父节点向下移,并把父节点作为当前节点,依次求父节点,即依次沿着树枝向上延伸直到根节点;
  3. 把元素item插入到正确位置;

最大堆的删除操作

最大堆的删除,即删除最大的元素。我们先取最后的元素提到根结点,然后删除最大值,然后再把新的根节点放到合适的位置。

首先删除根节点,并把最后一个节点临时作为新的根节点,将新的根节点作为当前节点与其孩子节点中最大的关键值节点进行比较,若小于其孩子节点的关键值,则与其孩子节点进行交换位置,并把新位置作为当前节点继续与其孩子节点进行比较,一直延伸下去,直到没有孩子节点为止;

源程序

函数声明:

#ifndef HEAP_H_INCLUDED
#define HEAP_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10
int heap[MAX_SIZE];
void max_Heap_insert(int *heap,int *n,int item);
int max_Heap_delete(int *heap,int *n);
#endif // HEAP_H_INCLUDED

函数的定义:

#include"heap.h"/*最大堆的插入操作*/
/*注:堆的下标是从1开始,而不是0*/
void max_Heap_insert(int *heap,int *n,int item)
{int i,parent;//i为当前节点,parent为i的父节点if((*n)==MAX_SIZE)//堆为满{printf("The heap is full\n");exit(1);}i=++(*n);parent=i/2;while((i!=1) && (item>heap[parent]))//若堆为非空,且所插入数据item大于父节点的关键字值{heap[i]=heap[parent];//父节点关键字值下移i=parent;//把父节点作为当前节点parent/=2;//依次求父节点}heap[i]=item;//插入到正确的位置
}
/*最大堆的删除操作*/
int max_Heap_delete(int *heap,int *n)
{int item,temp;int child,parent;if(*n==0)//若为空堆{printf("The heap is empty.\n");exit(1);}item=heap[1];//把最大堆的最大元素赋给itemtemp=heap[(*n)--];//堆的最后节点关键字值parent=1;child=2*parent;while(child<=(*n)){if(child<*n && heap[child]<heap[child+1])child++;//找出堆中最大关键字值的节点if(temp>=heap[child])break;//把最大节点关键字值与最后节点关键字值比较else{//若堆中存在比最后节点关键字值大的节点,则交换位置heap[parent]=heap[child];parent=child;child*=2;}}heap[parent]=temp;//插入到正确位置return item;//返回删除的关键字值
}

程序测试:

#include"heap.h"int main()
{int item,i;int n=0;for(i=1;i<MAX_SIZE;i++){scanf("%d",&item);max_Heap_insert(heap,&n,item);}for(i=1;i<=n;i++)printf("%d ",heap[i]);printf("\n");item=max_Heap_delete(heap,&n);printf("The deleted data is:%d",item);printf("\n");for(i=1;i<=n;i++)printf("%d ",heap[i]);return 0;
}

数据结构——最大堆和最小堆(C语言)相关推荐

  1. 最大堆和最小堆(数据结构)

    堆和栈的区别: 一.空间分配区别: 栈(操作系统):由操作系统自动分配释放,存放函数的参考值,局部变量的值等.其操作方式类似于数据结构中的栈 堆(操作系统):一般由程序员分配释放,若程序员不释放,程序 ...

  2. 数据结构与算法--二叉堆(最大堆,最小堆)实现及原理

    二叉堆(最大堆,最小堆)实现及原理 二叉堆与二叉查找树一样,堆也有两个性质,即结构性质和堆性质.和AVL树一样,对堆的一次操作必须到堆的所有性质都被满足才能终止,也就是我们每次对堆的操作都必须对堆中的 ...

  3. 最大堆和最小堆基本概念(以及栈和堆的区别)

    堆和栈的区别: 一.堆栈空间分配区别: 1.栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈: 2.堆(操作系统): 一般由程序员分配释放, ...

  4. C++实现最大堆和最小堆

    堆 堆数据结构是一种数组对象,它可以被视为一颗完全二叉树结构(或者也有可能是满二叉树) 最大堆: 任一结点的关键码均大于等于它的左右孩子的关键码,其中堆顶的元素最大.(任一路径中的元素升序排列) 最小 ...

  5. 使用最大堆和最小堆实现中位数的查找

    参考链接:双堆维护数组中位数 用堆维护中位数的意思是说,设计两个堆,第一个堆(大顶堆)存放小于中位数的元素,第二个堆(小顶堆)存放大于中位数的元素. 下面是双堆维护中位数的语言描述: 1.初始化的时候 ...

  6. 如何构造最大堆和最小堆?

    最大堆和最小堆又叫大顶堆和小顶堆(大根堆和小根堆),是二叉树的一种排列方式. 最大堆:根结点的键值是所有堆结点键值中最大者,且每个结点的值都比其孩子的值大. 最小堆:根结点的键值是所有堆结点键值中最小 ...

  7. 最大堆、最小堆Java实现,解决TOP K问题

    一.基础知识 1.1 什么是最大(小)堆 最大堆,最小堆类似,以下以最小堆为例进行讲解. 最小堆是满足以下条件的数据结构: 它是一棵完全二叉树 所有父节点的值小于或等于两个子节点的值 1.2 什么是完 ...

  8. C++判断一个序列是否为堆(最大堆、最小堆)

    参考:https://blog.csdn.net/guoweimelon/article/details/50904346 1.如何判断一个序列是不是堆? 把这个序列看成是数组型的二叉树,如果根节点是 ...

  9. 最大堆和最小堆和平衡二叉树_最小堆二叉树

    最大堆和最小堆和平衡二叉树 A Min Heap Binary Tree is a Binary Tree where the root node has the minimum key in the ...

最新文章

  1. CVPR 2019 | 百度17篇论文入选,AI巨头都在关注什么?(附论文下载)
  2. android开机启动c程序,如何让A20,android开机自动启动C程序【转】
  3. Java——集合(输入5个学生的信息按总分高低排序)
  4. css新单位 vw , vh
  5. 帖子回复——无限级分类
  6. 分享一个学习cocos-html5的链接
  7. 微信停止服务印度手机号注册用户!
  8. Pop3_解决PKIX:unable to find valid certification path to requested target 的问题
  9. 字符编码(一):序言
  10. fescar(Seata)详解
  11. 宜信正式开源其 AIOps 落地三大利器
  12. 数据库执行update语句,一直执行不完【已解决】
  13. android ip地址扫描,如何准确扫描Android中连接到wifi的所有设备的IP和Mac地址?
  14. HTML5 QQ登录背景动态图片
  15. QT 如何在背景图中将部分区域设置为透明
  16. 刘宇凡:一棵树给我的真理
  17. 桂电计算机信息管理专业课程有哪些,桂林电子工业大学-桂电研究生课程总表91上.doc...
  18. CES 2020最佳科技产品官方入围名单!三星笑了
  19. linux打开xml文件,xml文件扩展名,xml文件怎么打开?
  20. TransactionDefinition

热门文章

  1. 每日资源分享(自带7个接口的冰狱防红系统)
  2. 【树的哈希/树同构】2019-2020 ICPC, Asia Jakarta Regional Contest - F. Regular Forestation
  3. 书论31 张怀瓘《六体书论》
  4. redis批量删除名字包含“亚索”的 key
  5. 社保挂靠在人事外包公司名下可以吗
  6. 对联智能生成的原理(学习笔记附代码实现与详解)
  7. 2022-2028年全球与中国炉渣处理服务行业市场前瞻与投资战略规划分析
  8. java开发速成班培训课程(6)
  9. 大数据仍未攻克的五大世界性难题
  10. MT如何调用C#的dll所产生问题