【数据结构】 二叉树的顺序结构——堆的实现

普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储 。

一、堆的概念及结构

父节点比孩子结点大 是大堆

父节点比孩子结点小 是小堆

堆的性质

堆中某个节点的值总是不大于或不小于其父节点的值

堆总是一棵完全二叉树

二、堆的实现

接口函数

//Heap.h
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int HPDataType;
typedef struct Heap
{HPDataType* _a;int _size;int _capacity;
}Heap;// 堆的构建
void HeapCreate(Heap* hp);
// 堆的销毁
void HeapDestory(Heap* hp);
// 堆的插入
void HeapPush(Heap* hp, HPDataType x);
// 堆的删除
void HeapPop(Heap* hp);
// 取堆顶的数据
HPDataType HeapTop(Heap* hp);
// 堆的数据个数
int HeapSize(Heap* hp);
// 堆的判空
bool HeapEmpty(Heap* hp);

函数实现

//Heap.c
#include"Heap.h"
// 小堆
// 堆的构建
void HeapCreate(Heap* hp)
{assert(hp);hp->_a = NULL;hp->_size = 0;hp-> _capacity = 0;
}
// 堆的销毁
void HeapDestory(Heap* hp)
{assert(hp);free(hp->_a);hp->_a = NULL;hp->_size = 0;hp->_capacity = 0;
}
void swap(HPDataType* pa, HPDataType* pb)
{HPDataType tmp = *pa;*pa = *pb;*pb = tmp;
}
void AdjustUp(Heap* hp, int child)
{int parent = (child - 1) / 2;while (child > 0){if (hp->_a[child] < hp->_a[parent]){swap(&hp->_a[child], &hp->_a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}// 堆的插入   插入后 为了使堆满足依然是小堆的条件 将插入的数向上调整
void HeapPush(Heap* hp, HPDataType x)
{assert(hp);if (hp->_size == hp->_capacity){int newcapacity = hp->_capacity == 0 ? 4 : hp->_capacity * 2;HPDataType* tmp = (HPDataType*)realloc(hp->_a, newcapacity * sizeof(HPDataType));if (tmp == NULL){perror("realloc fail");exit(-1);}hp->_a = tmp;hp->_capacity = newcapacity;}hp->_a[hp->_size] = x;hp->_size++;//向上调整AdjustUp(hp,hp->_size-1);
}
void AdjustDown(Heap* hp)
{int parent = 0;int child = 2 * parent + 1;while (child <= hp->_size-1){//假设法 左孩子是较小的孩子 如果不是 更新一下if (hp->_a[child] > hp->_a[child + 1]){child++;}//比较 较小孩子与父节点大小 如果 较小孩子比父节点小 则交换if (hp->_a[child] < hp->_a[parent]){//较小孩子 与 父节点交换swap(&hp->_a[parent], &hp->_a[child]);}else{break;}//更新父节点、孩子节点 下标parent = child;child = 2 * parent + 1;}
}
// 堆的删除 (删除的是堆顶 -> 找 次大or次小)
//堆顶数据先与最后一个结点交换 交换到堆顶的数据 向下调整
void HeapPop(Heap* hp)
{assert(hp);assert(hp->_size > 0);//堆顶数据与最后一个数据 交换swap(&hp->_a[0],&hp->_a[hp->_size - 1]);//删除此时的最后一个数据(堆顶)hp->_size--;//将 新的堆顶向下调整 AdjustDown(hp);
}
// 取堆顶的数据
HPDataType HeapTop(Heap* hp)
{assert(hp);assert(hp->_size > 0);return hp->_a[0];
}
// 堆的数据个数
int HeapSize(Heap* hp)
{assert(hp);return hp->_size;
}
// 堆的判空
bool HeapEmpty(Heap* hp)
{assert(hp);return hp->_size == 0;
}

测试函数功能

//test.c
#include"Heap.h"
int main()
{Heap hp;HeapCreate(&hp);HPDataType a[] = { 2, 4, 9, 1, 12, 0, 5, 3, 7 };for (int i = 0; i < sizeof(a) / sizeof(HPDataType); i++){HeapPush(&hp, a[i]);}while (!HeapEmpty(&hp)){printf("%d ", HeapTop(&hp));HeapPop(&hp);}printf("\n");HeapDestory(&hp);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/9405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos7使用kubeadm搭建k8s集群(一主两从)----(mac版)

一、环境准备 1、下载centos7镜像 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 下载地址: centos安装包下载_开源镜像站-阿里云 选择对应的版本即可&#xff0c;我下载的&#xff1a;CentOS-7-x86_64-DVD-2207-02.iso 2、使用VirtualBox安装centos 选择新建&#xff0c…

Mac下安装ffmpeg

1、安装gedit brew install gedit2、配置环境变量&#xff0c;打开~/.zshrc&#xff0c;在末尾添加语句 export PATH$PATH:/usr/local/ffmpeg/bin3、执行语句&#xff0c;使环境变量生效 source ~/.zshrc 4、终端输入 ffmpeg &#xff0c;看环境变量是否配置成功。 至此&a…

现货黄金流程到何种程度?现货黄金在金融产品中的占比是多少?

踏入2024年以来&#xff0c;受美联储降息以及地缘局势紧张的影响&#xff0c;美元受压&#xff0c;避险情绪高涨&#xff0c;众多因素影响下黄金价格出现了强势的上涨&#xff0c;屡创历史新高。在上涨如此强劲的背景下&#xff0c;投资者希望通过黄金投资来实现资产增值。市场…

C++语法|进程虚拟地址空间和函数调用栈

本文来自施磊老师的课程&#xff0c;老师讲的非常不错&#xff0c;我的笔记也是囫囵吞枣全部记下&#xff0c;但是我在这里推荐一本书&#xff0c;真的真的建议初学C或者想要进阶C的同学们看看&#xff1a;《CPU眼里的C/C》 文章目录 进程的虚拟地址空间和布局进程虚拟地址空间…

ros 学习记录(二)URDF小车运动控制

URDF小车运动控制 准备工作创建 robot_xacro.launch 接上文&#xff0c;想用键盘控制小车在Gazebo中移动。 准备工作 名称版本ROSNoeticGazebo11.11.0 创建 robot_xacro.launch 通过运行这个launch文件&#xff0c;可以启动Gazebo仿真环境&#xff0c;并在仿真环境中加载和…

【八十五】【算法分析与设计】单调栈的全新版本,两个循环维护左小于和右小于信息,84. 柱状图中最大的矩形,85. 最大矩形

84. 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释&am…

nginx开启局域网https访问

需求 调试webRTC 功能,需要在局域网搭建https发给我协议; 实现 环境 局域网已部署有nginx; 部署可参考专栏文章 已安装Openssl 未安装可以执行 sudo yum install openssl 这个命令进行安装 生成证书和私钥 生成私钥:打开命令提示符或终端窗口,执行以下命令以生成私钥文件…

日本站群服务器的优点以及适合该服务器的业务类型?

日本站群服务器的优点以及适合该服务器的业务类型? 日本站群服务器是指位于日本地区的多个网站共享同一台服务器的架构。这种服务器架构有着诸多优点&#xff0c;使其成为许多企业和网站管理员的首选。以下是日本站群服务器的优点以及适合该服务器的业务类型的分析&#xff1…

企业怎样进行项目管理?

在当今快节奏的商业环境中&#xff0c;企业要想保持竞争力&#xff0c;有效的项目管理是关键。项目管理不仅涉及到规划、执行和监控&#xff0c;还包括团队协作、资源分配和风险管理等多个方面。zz-plan 作为一款集多种功能于一体的在线甘特图协作软件&#xff0c;为企业项目管…

【小笔记】问答系统可视化实现的三种方式

下面三种方式都是基于Python的哈&#xff0c;从简单到复杂。 方式一&#xff1a;命令行交互问答 优点&#xff1a;原始简单直接 方式二&#xff1a;使用Python可视化框架 优点&#xff1a;无需学习前端技术栈即可搭建一个web。 streamlit&#xff1a;⭐️⭐️⭐️⭐️gra…

MySQL——变量的定义与使用

新建链接&#xff0c;自带world数据库&#xff0c;里面自带city表格。 DQL # MySQL变量的定义与使用 #1、不允许数字作为开头 #2、只能用_或$符号&#xff0c;不允许使用其他符号 #3、不允许使用关键字或保留字 set userName小可爱; select userName; #标识符只影响当前查询#…

Web地理空间引擎

Web地理空间引擎是指用于在Web上创建和显示地理空间信息的软件平台。它们通常提供一组API和工具&#xff0c;用于加载、可视化和分析地理空间数据。Web地理空间引擎被广泛应用于各种应用&#xff0c;例如地图、导航、位置服务、游戏和模拟等。北京木奇移动技术有限公司&#xf…

24数维杯ABC题思路已更新!!!!

24数维杯A题保姆级思路&#xff0b;配套代码&#xff0b;后续参考论文 简单麦麦https://www.jdmm.cc/file/2710639/ 24数维杯B题保姆级思路&#xff0b;可执行代码&#xff0b;后续参考论文 简单麦麦https://www.jdmm.cc/file/2710640/ 24数维杯C题保姆级思路&#xff0b;可执…

四选一多路选择器

描述 制作一个四选一的多路选择器&#xff0c;要求输出定义上为线网类型。状态转移&#xff1a; d0 11 d1 10 d2 01 d3 00 信号示意图如下所示&#xff1a; 波形示意图&#xff1a; 输入描述&#xff1a; 输入信号 d1,d2,d3,d4 sel 类型 wire 输出描述…

宝塔面板如何删除一个站点

我们一般的网站都是PHPMySQL开发的&#xff0c;所以删除站点&#xff0c;就要先删数据库&#xff0c;再删网站目录 注意&#xff1a;一点要确保无用的再删 删除站点目录

01 JVM -- JVM 体系结构、HotSpot

1. JVM、HotSpot、 OpenJDK 的区别 JVM (Java Virtual Machine) 是一个虚拟机HotSpot 是 JVM 规范的一个实现。HotSpot 虚拟机通过即时编译 (JIT) 技术将 Java 字节码转换为本地机器码&#xff0c;以提高程序的执行效率。OpenJDK 是一个项目名&#xff0c;它在 HotSpot 的基础…

DRF之视图集

【 一 】视图集 ​ 在 RESTful 架构中&#xff0c;对资源的常规操作无非就是查询、新增、修改、删除等这么几种。为此&#xff0c;django-rest-framework 分别提供了对应通用类视图函数。但是&#xff0c;如果对同一个资源的不同操作逻辑分散在各个视图函数中&#xff0c;从逻…

C++STL细节,底层实现,面试题04

文章目录 19. STL19.1. 序列容器19.1.1. vector19.1.1.1. 底层实现和特点19.1.1.2. 常用函数19.1.1.3. emplace_back() vs push_back() 19.1.2. array19.1.2.1. 底层实现和特点19.1.2.2. 常用函数 19.1.3. deque19.1.3.1. 底层实现和特点19.1.3.2. 常用函数 19.1.4 list19.1.4.…

性能远超GPT-4!谷歌发布Med-Gemini医疗模型;李飞飞首次创业瞄准空间智能;疫苗巨头联合OpenAl助力AI医疗...

AI for Science 企业动态速览—— * 谷歌 Med-Gemini 医疗 AI 模型性能远超 GPT-4 * 斯坦福李飞飞首次创业瞄准「空间智能」 * 疫苗巨头 Moderna 与 OpenAl 达成合作 * 美国能源部推动 AI 在清洁能源领域的应用 * 美年健康荣获「2024福布斯中国人工智能创新场景应用企业TOP10」…

2024-5-9

今日流水账&#xff1a; 上午&#xff1a;又睡懒觉了&#xff0c;9点半才起来… 还是在调之前的那个 kernel pwn&#xff0c;但是 CONFIG_SLAB_FREELIST_HARDENED 加固泄漏 cookie 哪里我还是没搞明白&#xff08;&#xff1a;服了然后去理发、冲水卡了&#xff08;&#xff1a…