数据结构之二叉树(2)

数据结构之二叉树(2)

  • 1.二叉树的存储结构
  • 2.实现顺序结构二叉树
    • 2.1何为堆
    • 2.2堆的性质
    • 2.3堆的定义
    • 2.3堆的初始化与销毁
  • 3.1向上调整算法
  • 3.2向下调整算法
  • 4.入堆
  • 5.出堆

让花成花,让树成树
上一次我们学习了树的分类,并初步了解了二叉树。
今天我们深入了解二叉树并写出C语言代码

1.二叉树的存储结构

在学习C语言时,我们就知道了数据有两种存储结构,一种是顺序结构,一种是链式结构。
对于用数组来实现的二叉树,完全二叉树要优于非完全二叉树。
在这里插入图片描述
在这里插入图片描述
我们从图中可以看到,非完全二叉树会有空间浪费。
现实中我们通常把堆(⼀种⼆叉树)使⽤顺序结构的数组来存储,需要注意的是这⾥的堆和操作系统虚拟进程地址空间中的堆是两回事,⼀个是数据结构,⼀个是操作系统中管理内存的⼀块区域分段。

2.实现顺序结构二叉树

堆是⼀种特殊的⼆叉树,具有⼆叉树的特性的同时,还具备其他的特性。

2.1何为堆

堆是一种树形数据结构,每个父节点都大于或等于(最大堆)或者小于或等于(最小堆)其子节点,根节点的值是堆中所有元素的最大值或最小值。
在这里插入图片描述
在这里插入图片描述

2.2堆的性质

  • 堆中某个结点的值总是不⼤于或不⼩于其⽗结点的值;
  • 堆总是⼀棵完全⼆叉树

在用代码实现前,我们还需要知道一些二叉树的性质:
在这里插入图片描述

2.3堆的定义

typedef int HpDataType;
typedef struct Heap {HpDataType* arr;int size;int capacity;
}Hp;

size表示有效个数
capacity表示可用容量

2.3堆的初始化与销毁

//初始化
void HpInit(Hp* php) {assert(php);php->arr = NULL;php->size = php->capacity = 0;
}
//销毁
void HpDestroy(Hp* php) {assert(php);if (php->arr)free(php->arr);php->size = php->capacity = 0;
}

3.1向上调整算法

当我们往堆中添加数据时,怎么能使数据自动校正自己的位置,使得其插入后任然满足是一个堆。
对于大堆:

//向上调整
void AdjustUp(HpDataType* arr, int child) {int parent = (child - 1) / 2;while (child > 0) {if (arr[child] > arr[parent]) {Swap(&arr[child], &arr[parent]);child = parent;parent = (child - 1) / 2;}else {break;}}
}

每一次和父节点比较,如果比父节点大则交换并使父节点变子节点,再找新的父节点比较。否则退出循环。

3.2向下调整算法

对于大堆:

//向下调整
void AdjustDown(HpDataType* arr, int parent, int n) {int child = 2 * parent + 1;while (child < n) {//对于两个子节点,先找到较大的一个,再与之比较if (child + 1 < n && arr[child] < arr[child + 1]) {child++;}if (arr[child] > arr[parent]) {Swap(&arr[child], &arr[parent]);parent = child;child = 2 * parent + 1;}else {break;}}
}

4.入堆

//入堆
void HpPush(Hp* php,HpDataType x) {assert(php);//空间不够增容if (php->size == php->capacity) {int newcapacity = php->capacity == 0 ? 4 : 2 * (php->capacity);HpDataType* tmp = (HpDataType*)realloc(php->arr, newcapacity * sizeof(HpDataType));if (tmp == NULL) {perror("realloc fail");exit(1);}php->arr = tmp;php->capacity = newcapacity;}php->arr[php->size++] = x;//向上调整AdjustUp(php->arr, php->size - 1);
}

5.出堆

出堆指的是堆顶元素出去。

//出堆
void HpPop(Hp* php) {assert(!HpEmpty(php));Swap(&php->arr[0], &php->arr[php->size - 1]);php->size--;//重新向上调整AdjustUp(php->arr, php->size - 1);//如果使用向下调整,换成	AdjustDown(php->arr, 0, php->size);
}


如果发现错误,欢迎打在评论区。
主页还有更多优质内容OvO

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

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

相关文章

Linux操作系统之Ubuntu

Ubuntu是基于Debian的开源Linux发行版&#xff0c;由Canonical公司维护&#xff0c;以用户友好性和稳定性著称。它广泛应用于个人电脑、服务器及云计算环境&#xff0c;支持多种硬件架构。Ubuntu的特点Ubuntu提供定期更新版本&#xff08;每6个月&#xff09;和长期支持版本&am…

kotlin的函数前面增加suspend关键字的作用

deepseek回答&#xff1a; Kotlin中suspend关键字的作用详解 核心作用 suspend关键字用于标记‌挂起函数‌&#xff0c;使其能够在协程中实现非阻塞的异步操作。 suspend关键字的本质作用 suspend关键字的主要作用是‌标记一个函数为挂起函数‌&#xff0c;使其能够在协程中使用…

Vibe Coding实战项目:用Qwen3-Coder做了个AI跳舞视频生成器

大家好&#xff0c;这里是K姐。 一个 Vibe Coding 的探索者。 前段时间发现通义发起了一个Qwen3-Coder挑战赛&#xff0c;最高奖金有10000元&#xff0c;研究了一下&#xff0c;我发现这个赛道太宽了&#xff0c;不限项目&#xff0c;用 AI Coding 做数据分析、个人Blog、抓取…

Kafka面试精讲 Day 13:故障检测与自动恢复

【Kafka面试精讲 Day 13】故障检测与自动恢复 在“Kafka面试精讲”系列的第13天&#xff0c;我们将深入探讨 Kafka 高可用体系中的关键一环&#xff1a;故障检测与自动恢复机制。作为分布式系统的核心能力&#xff0c;Kafka 如何在 Broker 宕机、网络分区或磁盘故障时快速感知…

【前沿技术拓展Trip Two】具身智能

具身智能&#xff08;Embodied AI&#xff09;的认识&#xff0c;进展&#xff0c;以及为何难以实现 在讲具身智能之前&#xff0c;我们不得不先行介绍一下离身智能与离身认识系统这两个极其相关且更加常见的概念 离身认识系统 其实目前绝大多数的AI&#xff0c;例如DeepSeek&a…

使用electron将vue3网页项目包装成pc客户端

一、准备前工作在项目的根目录 打开命令行工具 安装四个依赖库安装报错的话二、准备工作完成之后&#xff0c;在项目根目录需要有俩个文件在项目根目录创建electron文件夹在vite.config.js中添加配置项在package.json中添加配置项运行命令 npm run electron:build 打包关于mac&…

基于安全抽象模型(SAM)的汽车网络安全防御与攻击分析

摘要自动驾驶汽车比以往任何一种个人出行交通工具都具有更大的受攻击可能性。这主要是因为这类汽车对通信有极高的需求&#xff0c;一方面是出于功能和安全方面的考虑&#xff0c;另一方面则是为了满足舒适性需求。无人驾驶汽车需要与周围环境进行通信的接口、直接连接&#xf…

线扫相机不出图原因总结

1、帧触发信号有问题 线扫相机出图由帧信号决定开始采集,如果没有帧信号线扫相机无法识别开始信号,所以不出图 1)没有给相机帧信号 帧信号是一个短暂的脉冲信号,持续时间不要太长,相机能识别就可以,一般由plc或者控制卡的数字量输出口触发,可以通过监测数字量输出口来确…

开发避坑指南(46):Java Stream 对List的BigDecimal字段进行求和

需求 对int&#xff0c;long类型的数据求和直接用stream().mapToInt()、stream().mapToDouble()&#xff0c;可是没有stream().mapToBigDecimal()这样的方法&#xff0c;那么如何用stream对List的BigDecimal字段进行求和&#xff1f; 代码实现 直接上代码 public class OrderIn…

pycharm如何处理python项目间引用

1. 如何在pycharm中将其它项目添加到打开的项目中 如图所示&#xff1a;文件->打开->附加&#xff08;Attach&#xff09;即可2.如何引用:直接作为一个普通package引用即可 from attack_projectxxx.modulexxx import xxx3.pyinstaller如何编译这种引用其它项目的可执行文…

家庭劳务机器人发展阶段与时间预测

家庭劳务机器人大规模进入家庭不会是一个单一的时间点&#xff0c;而是一个分阶段、渐进式的过程。我们可以将这个进程分为以下几个阶段&#xff0c;并对每个阶段的时间线进行预测&#xff1a;第一阶段&#xff1a;单一功能机器人普及&#xff08;现在 - 2025年&#xff09;这个…

Zynq开发实践(FPGA之spi实现)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】虽然串口用的地方比较多&#xff0c;实现起来也比较简单。但是串口本身速度比较慢&#xff0c;不利于高速数据通信。而且单个串口没有办法和很多芯片…

指甲打磨机/磨甲器MCU控制方案开发,轻松解决磨甲问题

美甲打磨机/指甲打磨机核心功能需求 1. 基础功能 无级调速(5,000-30,000 RPM&#xff0c;PWM控制) 正反转切换&#xff08;可选&#xff0c;用于抛光/去角质&#xff09; 按键锁/防误触&#xff08;长按3秒解锁&#xff09; 锂电池管理&#xff08;3.7V单节&#xff0c;带充电指…

临床数据挖掘与分析:利用GPU加速Pandas和Scikit-learn处理大规模数据集

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;注册即送-H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 摘要 随着电子健康记录&#xff08;EHR&#xff09;的普…

二进制安装MySQL 8.0指南:跨平台、自定义数据路径、安全远程访问配置

二进制安装 MySQL 8.0 在生产或测试环境中&#xff0c;我们常常希望避免包管理器带来的依赖和交互问题&#xff0c;尤其是当系统自带版本过旧或安装过程频繁弹窗时。此时&#xff0c;使用 MySQL 官方提供的二进制压缩包&#xff08;Generic Linux Binary&#xff09; 进行安装…

Z检验与T检验的区别与联系:原理、公式和案例全解

Z检验与T检验全解析&#xff1a;原理、区别与实际案例 统计学的核心任务之一&#xff0c;就是通过有限的样本数据去推断总体特征。在这一过程中&#xff0c;假设检验成为了最常见的工具。而在众多检验方法中&#xff0c;Z检验与T检验几乎是入门必学&#xff0c;也是应用最广泛的…

SpringBoot之缓存(最详细)

文章目录项目准备新建项目并选择模块安装添加依赖添加application.yml删除demos.web包编写pojo层userdto/ResultJson编写mapper层UserMapper编写service层UserService编写controller层编写配置类MybatisPlusConfig编写测试类1 缓存分类1.1 MyBatis一级缓存1.2 MyBatis二级缓存1…

B站 韩顺平 笔记 (Day 29)

目录 1&#xff08;集合的框架体系&#xff09; 2&#xff08;Collection接口和常用方法&#xff09; 2.1&#xff08;Collection接口实现类特点&#xff09; 2.2&#xff08;常用方法&#xff09; 2.3&#xff08;遍历元素方式1&#xff1a;迭代器&#xff09; 1&#x…

axios报错解决:unsupported BodyInit type

目录 问题 原因 解决方法 问题 Got ‘unsupported BodyInit type’ bug on iPhone 14(IOS 17.5) Issue #6444 axios/axios 我这里是iPhone 6plus打开会报错白屏 好多人遇到了相同的问题 当我在 iPhone 14 上浏览页面时,我收到一条错误消息:错误:不支持的 BodyInit 类型,…

iperf3网络性能测试工具

iperf3 是一个功能非常强大的网络性能测试工具,用于测量两个网络节点之间的最大TCP、UDP带宽和性能。它通过创建数据流并测量其吞吐量来工作。 下面我将为您详细介绍其核心用法、常用命令和参数。 核心概念:客户端/服务器模式 iperf3 测试需要两台机器:一台作为服务器端(…