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

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

一、堆的概念及结构

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

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

堆的性质

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

堆总是一棵完全二叉树

二、堆的实现

接口函数

//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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot设置默认文件大小

1、问题发现 有个需求&#xff0c;上传文件的时候&#xff0c;发现提示了这个错误&#xff0c;看了一下意思是说&#xff0c;文件超过了1M。 看我们文件的大小&#xff1a; 发现确实是&#xff0c;文件超出了1M&#xff0c;查了一下资料&#xff0c;tomcat默认上传文件大小为1M…

2024龙年新版ui周易测算网站H5源码/在线起名网站源码/运势测算网站系统源码

更新日志 1、修复时间不能选择子时; 2、部分机型支付后不跳转; 3、新增后台支持按照时间、项目、进行订单筛选查询; 4、数据库新增测算结果的纳音、藏干、感情、性格分析; 5、微信支付支持https证书; 6、修复PC端扫码支付问题; 7、新增代理分销功能; 8、新增会员功能&a…

如何把小程序视频下载保存

在这个快节奏的数字时代&#xff0c;小程序已成为我们生活的一部分&#xff0c;而那些在小程序中流转的精彩视频&#xff0c;常常让我们驻足。想象一下&#xff0c;如果能够将这些瞬间的精彩捕捉下来&#xff0c;让它们不再只是屏幕上的一抹流光&#xff0c;而是成为你个人收藏…

Adobe Media Encoder ME v24.3.0 解锁版 (视频和音频编码渲染工具)

Adobe系列软件安装目录 一、Adobe Photoshop PS 25.6.0 解锁版 (最流行的图像设计软件) 二、Adobe Media Encoder ME v24.3.0 解锁版 (视频和音频编码渲染工具) 三、Adobe Premiere Pro v24.3.0 解锁版 (领先的视频编辑软件) 四、Adobe After Effects AE v24.3.0 解锁版 (视…

[算法][贪心算法][leetcode]2244. 完成所有任务需要的最少轮数

题目地址 https://leetcode.cn/problems/minimum-rounds-to-complete-all-tasks/description/ 错误解法&#xff08;暴力解法&#xff09; class Solution {public int minimumRounds(int[] tasks) {int ans 0;//先用一个hashmap记录每个key值出现的次数//判断他们是否能被2或…

Vue3实战笔记(21)—自定义404页面

文章目录 前言一、标题1二、通过守卫导航配置404总结 前言 一个精致的404页面对于网站的用户体验至关重要。404页面&#xff0c;也称为“未找到”页面&#xff0c;是在用户尝试访问网站中不存在或已删除的页面时显示的。 一、标题1 404都很熟悉了&#xff0c;vue3默认找不到界…

高校推免报名|基于SSM+vue的高校推免报名系统的设计与实现(源码+数据库+文档)

高校推免报名 目录 基于SSM&#xff0b;vue的高校推免报名的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2后台登录模块 5.2.1管理员功能模块 5.2.2考生功能模版 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八…

【数据结构】解密链表之旅(单链表篇)

前言 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累。我想让大家知道…

基于PHP+MySQL开发的 外卖点餐在线二合一小程序源码系统 附带源代码以及系统的部署教程

在移动互联网时代&#xff0c;外卖行业蓬勃发展&#xff0c;各大外卖平台竞争激烈。然而&#xff0c;传统的外卖平台存在诸多问题&#xff0c;如用户体验不佳、操作繁琐、系统性能低下等。罗峰给大家分享一款基于PHPMySQL的外卖点餐在线二合一小程序源码系统。该系统旨在为用户…

FullCalendar日历组件集成实战(3)

背景 有一些应用系统或应用功能&#xff0c;如日程管理、任务管理需要使用到日历组件。虽然Element Plus也提供了日历组件&#xff0c;但功能比较简单&#xff0c;用来做数据展现勉强可用。但如果需要进行复杂的数据展示&#xff0c;以及互动操作如通过点击添加事件&#xff0…

什么是工具? 从语言模型视角的综述

24年3月CMU和上海交大的论文“What Are Tools Anyway? A Survey from the Language Model Perspective”。 到底什么是工具&#xff1f; 接下来&#xff0c;工具在哪里以及如何帮助语言模型&#xff1f; 在综述中&#xff0c;对语言模型使用的外部程序工具进行了统一定义&…

Redis-分片集群存储及读取数据详解

文章目录 Redis分片集群是什么&#xff1f;Redis分片集群的存储及读取数据&#xff1f; 更多相关内容可查看 Redis分片集群是什么&#xff1f; Redis分片集群是一种分布式部署方式&#xff0c;通过将数据分散存储在多个Redis节点上&#xff0c;从而提高了系统的性能、扩展性和…

解密跨境电商ERP开发的5大常见问题及解决方案

跨境电商平台开发是一个充满挑战的领域&#xff0c;企业在此过程中常常面临着各种技术、管理和资源等方面的问题。下面是解析这些问题并提供解决方案的五大主要问题&#xff1a; 1. 集成难题&#xff1a; 在跨境电商平台开发中&#xff0c;一个最为常见的问题是集成不同系统和…

中国高分辨率国家土壤信息网格基本属性数据集(2010-2018)

中国高分辨率国家土壤信息网格基本属性数据集&#xff08;2010-2018&#xff09; 数据介绍 土壤是人类生存和发展的基础&#xff0c;多个联合国可持续发展目标&#xff08;SDGs&#xff09;与土壤资源利用和管理直接相关。然而&#xff0c;全球和我国现有土壤信息大多源于历史土…

酒厂做配送分销小程序商城的作用是什么

线上优势明显&#xff0c;酒厂零售批发需要多渠道进行&#xff0c;品牌宣传、酒水经营分销配送、会员管理以及拓展更多营收可能等&#xff0c;商家与客户都需要完善的体系触达对方。 运用【雨科】平台搭建酒厂商城&#xff0c;电脑手机网页端和微信小程序端&#xff0c;多渠道…

可重构柔性装配系统,为制造业的未来描绘出一幅崭新的蓝图

随着科技的飞速发展&#xff0c;传统的产线设计模式正面临着前所未有的挑战。在这个变革的时代&#xff0c;可重构柔性装配系统凭借其独特的优势&#xff0c;正引领着智能化生产的新浪潮&#xff0c;为制造业的未来描绘出一幅崭新的蓝图。 传统的产线设计往往固定且僵化&#x…

精品录播|电磁场数值仿真技术及天线设计与应用

电磁场数值仿真技术及天线设计与应用

失业,登上了网络悲惨排行榜热传?

几年前&#xff0c;有关“失业”这个话题早就频繁地出现在国内各大社交网站&#xff0c;原以为早已淡化了&#xff0c;殊不知今天浏览国内各大社交网站&#xff0c;惊讶地发现它竟然登上了“悲惨排行榜”并被热传&#xff0c;便认为对此话题有闲聊一会儿的必要。 截图&#xff…

2024年泰迪智能科技专业共建合作方案

泰迪智能科技打造基于产教融合就业育人综合服务平台&#xff0c;深化产教融合&#xff0c;持续完善三位一体的数据智能生态体系&#xff0c;促进教育链、人才链与产业链、创新链的有机衔接&#xff0c;为培养高素质创新人才及企业数据智能应用落地略尽绵薄之力。 2024年泰迪智…

ios与android上音频格式的推荐

首先贴一张官方对于ios与android上音频格式的推荐&#xff1a; 这里只给出了推荐格式&#xff0c;一般我们在实际运用中会使用如下方式&#xff1a; 一、IOS与安卓各一套&#xff1a;音乐&#xff1a;都使用MP3 音效&#xff1a;ios用caf Android用ogg 二、使用通用的MP3格式…