【数据结构】二叉树——堆

news2024/11/30 5:02:31

一、二叉树的概念与结构

二叉树的概念

二叉树是树的一种,二叉树的特殊之处在于,每个根节点都可以有两个子节点,可以两个子节点都为空,或者一个为空,一个不为空,或者两个都有数,在构建二叉树的节点时就可以看出:
在这里插入图片描述
现实中的二叉树:
在这里插入图片描述
就像这颗树,每次分叉都分出两个枝条,这就是一个二叉树
在这里插入图片描述

特殊的二叉树

完全二叉树

完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。

满二叉树

满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是,则它就是满二叉树。

在这里插入图片描述

二、特殊的二叉树——堆

2.1 堆的定义

首先堆是一个完全二叉树,堆中的数字要以一定的规则进行排列
如果我们创建一个堆
让堆中所有根部数据都小于该根的左右两孩子的数据,那么这个就是一个小堆
让堆中所有根部数据都大于该根的左右两孩子的数据,那么这个就是一个大堆
在这里插入图片描述
所以我们可以理解为,若堆第一层根部为整个堆的最大值,为大堆,若为整个堆的最小值,为小堆

2.2 堆的结构

我们知道了堆的定义那我们如何队堆进行创建以及存储呢?
有两个方案:顺序结构存储,链式结构存储

顺序结构存储

我们要定义父母节点和孩子节点
父母数组下标:
parent = (child - 1) / 2
孩子数组下标:
左孩子:child = parent * 2 + 1
右孩子:child = parent * 2 + 2
在这里插入图片描述

在这里插入图片描述

如图我们将二叉树通过顺序表,也就是数组存储
优点:有下标查找数据方便
缺点:有可能会出现空的情况浪费空间,在顺序表开辟空间时一次开辟二倍,会造成空间浪费

链式结构存储

在这里插入图片描述
我们像上面开辟二叉树的节点,分为根节点,左孩子节点,右孩子节点
优点:随用随开,不会有空间浪费
缺点:无法随意访问树中元素,只能遍历

总结

对于堆这种特殊二叉树来说,因为堆是完全二叉树,所以不存在中间有用不到的空间,所以对于创建堆这个特殊结构,我们选择采用顺序结构存储。

2.3 堆的代码实现

堆的结构体创建

在这里插入图片描述

堆的初始化

在这里插入图片描述
先判断传过来的是否为空指针,若为空指针则下面无法解引用,会使程序出错
在初始化阶段可以选择先开辟空间,比如先开辟四个空间,但是在插入时也会开辟空间,会有一些重复,我就没有选择开辟。

堆的销毁

因为我们要动态开辟空间,所以为了避免出现内存泄漏,我们要将开辟的空间进行释放
在这里插入图片描述
这里我们不能直接 free(php) 因为堆中还有我们开辟的数组,如果直接释放,就会使内存泄漏,并且使程序中出现野指针。
在这里插入图片描述

堆的插入

在将堆插入时我们要考虑以下一些问题:
1、是否需要为插入数据开辟空间
2、当数据插入堆时,我们需要对堆进行调整

问题1

解决问题1,我们要先将 size 与 capacity 进行比较,若相等说明需要开辟空间
在这里插入图片描述

问题2

解决问题2,我们要将插入的数进行向上调整,我们传进去的是孩子所在下标,我们要找到其父母下标,向上调整对多的情况是插入的数为最小值到了下标为0的位置。

我们写一个向上调整函数:
传入的是数组,和要向上调整的孩子节点。
在这里插入图片描述

堆的删除

这里的删除并不是将最后一个数删除,而是将下标为0位置的根删除,这就会引发一系列问题:
如何删除,是通过将后面的数据把根位置的数据覆盖吗?如果如此做的话,后面的数就不是堆了,还要重新建堆,这未免有些不合适。
在这里插入图片描述
如果删除之后要重新建堆,效率就会变得很低。

所以我们若要删除根位置节点,就不能直接删除
我们采用的方法是将数组末尾的数与根位置的节点进行交换,然后删除数组末尾的数据,因为根的两个子树没有变,所以两个子树还是堆,将根位置交换过去的数进行向下调整
向下调整:
向下调整和向上调整相反
向上调整是将数据从孩子向上与父母比
向下调整时将数据从父母向下与孩子比
若是小堆,向下调整时要与孩子中小的那一个进行比较,因为若是与两个孩子中较大的那一个进行比较有可能较大的孩子大于另外一个孩子而小于父亲,当这个孩子被换到上面时就会出错。
在这里插入图片描述

我们将数组传过去,将数组的数量传过去,再将数组的父母下标传过去,然后找到自己两孩子中小的孩子,与最小的孩子进行比较,交换之后,再让父母到孩子位置,孩子到他们孩子的小的孩子的位置,再进行比较,直到孩子到数组大小边界,循环停止。
在这里插入图片描述

在这里插入图片描述

取堆顶数据

在这里插入图片描述

堆的数据个数

在这里插入图片描述

判断堆是否为空

在这里插入图片描述

总结

堆的全部代码
在做出的堆之后,我们要明白我们为社么要创建堆,明白为什么要做那么多接口,以及堆的应用场景。

三、如何建堆

向上调整建堆

向上建堆很好理解,我们之前写的向上调整函数,我们将数组中每个元素都进行一次向上调整,相当于每次循环都将数组中的数插入,向上调整,成功建堆。
在这里插入图片描述

向下调整建堆

向下调整建堆,我们想如果我们能从下标为0开始直接向下调整就很方便,但是我们不能保证下标为0的位置下面它的孩子是堆,所以我们要想向下调整建堆,我们要让下面每一个子树都是堆,那我们从最后一个孩子开始找他的父亲让他们先建堆,然依次让每个父母位置都向下调整,最后就可以成功建堆。
在这里插入图片描述
在这里插入图片描述

向上调整建堆与向下调整建堆的效率区别

既然有两种建队方法,那具体哪一种建堆方法更好呢?

向上调整

在这里插入图片描述
最大调整次数指的是,该层数据向上调整时,最多会调整多少次,就比如第一层,数最多调整 0 次,因为此时堆中就只有一个,
第二层,数最多调整 1 次
依次类推……
第 h 层,数最多调整 h - 1 次

向下调整

在这里插入图片描述
第 h 层,数最多向下调整 0 次,因为他们下面没有数
第 h - 1 层,数最多向下调整 1 次
依次类推……
第一层, 数最多向下调整 h - 1次

总结

根据上面我们发现,在堆中
向上调整:
当数越时,调整次数越
当数越时,调整次数越
向下调整:
当数越时,调整次数越
当数越时,调整次数越

在这里插入图片描述
而且对于这个每层数据个数都是前一个层数据个数的二倍的结构来说,这个数据处理量的差别是很大的。

在这里插入图片描述
根据错位相减,得到数据个数的总数,我们可以发现第 h 层几乎占了数据个数的 50%
所以我们得出结论,向下调整建堆比向上调整建堆效率要高很多

四、堆排序

前面我们知道了堆如何创建,如何建堆,那我们建堆有什么用呢?
我们发现不管是大堆还是小堆,在下标为 0 的位置一定是数组中的最大或者最小值,那么我们就可以依据此进行排序操作。
在这里插入图片描述

当我们要排序降序时,我们将第一个数与最后一个数进行交换,这个最小的数就到了最后,然后再对剩下的数进行向下调整,然后再循环此操作,最后就可以得到降序的数组。
升序时建大堆,再进行此操作。

堆排序的效率非常高,但是对有很多重复数据的数组排序速度会低一些

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

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

相关文章

scala 权限

一.访问权限 idea实例 关于protected:

开源AI助力医疗革新:OCR系统与知识图谱构建

在医疗健康领域,数据的整合和分析对于提升临床决策、优化患者护理和加速科研发现至关重要。思通数科AI平台通过构建医疗知识图谱,从海量医疗文本中提取关键信息,助力医疗服务智能化。我们的平台体验地址是:https://nlp.stonedt.co…

ELK之路第二步——可视化界面Kibana

Kibana 1.安装2.解压3.修改配置4.启动 这部分内容就比较简单了,水一片文章。 1.安装 需要梯子 官网下载链接:https://www.elastic.co/cn/downloads/past-releases/kibana-7-3-0 如果你去官网下载页面,点击下载是404报错,记得切换…

关键词排名技巧实用指南提升网站流量的有效策略

内容概要 在数字营销的世界中,关键词排名的影响不可小觑。关键词是用户在搜索引擎中输入的词语,通过精确选择和优化这些关键词,网站能够更轻松地被目标用户发现。提升关键词排名的第一步是了解基本概念,包括关键词的分类、重要性…

Java 多线程(八)—— 锁策略,synchronized 的优化,JVM 与编译器的锁优化,ReentrantLock,CAS

前言 本文为 Java 面试小八股,一句话,理解性记忆,不能理解就死背吧。 锁策略 悲观锁与乐观锁 悲观锁和乐观锁是锁的特性,并不是特指某个具体的锁。 我们知道在多线程中,锁是会被竞争的,悲观锁就是指锁…

Uniapp如何处理后端返回图片流验证码

登录验证码请求接口返回内容为乱码 处理代码 uni.request({url: 你请求的地址,method: POST,data:data,header:header,//请求头responseType: arraybuffer,//告诉服务器你希望得到的响应类型为arraybuffer(二进制数据)类型success: res > {let resul…

QT 多语言转换 ts、qm

QT开发之路 企业级开发系列文章,主要目标快速学习、完善、提升 相关技能 高效完成企业级项目开发 分享在企业中积累的实用技能和经验。 通过具体的编码过程、代码示例、步骤详解、核心内容和展示的方法解决遇到的实际问题。 阅读前声明 本系列文章属于付费内容 禁止…

【论文笔记】Perceiver: General Perception with Iterative Attention

🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: Perceiver: General Perce…

spring-第十一章 注解开发

spring 文章目录 spring前言1.注解回顾1.1原理1.2springIOC注解扫描原理1.2.1解释1.2.2案例 2.声明bean的注解补充:Bean注解,管理三方包对象 3.spring注解的使用3.1加入aop依赖3.2配置文件中添加context命名空间3.3配置文件中指定要扫描的包3.4在Bean上使…

【CSS in Depth 2 精译_055】8.3 伪类 :is() 和 :where() 的正确打开方式

当前内容所在位置(可进入专栏查看其他译好的章节内容) 【第三部分 现代 CSS 代码组织】 ✔️【第八章 层叠图层及其嵌套】 ✔️ 8.1 用 layer 图层来操控层叠规则(上篇) 8.1.1 图层的定义(上篇)8.1.2 图层的…

20241028给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Buildroot之后确认AP6275P的蓝牙BLE功能

20241028给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Buildroot之后确认AP6275P的蓝牙BLE功能 2024/10/28 16:56 手机:realme的GT NEO5【只要手机支持蓝牙BLE即可】 APK:在【你用的手机】应用市场下载 BLE调试助手并安装之后别用。 缘起:为了简…

大模型,多模态大模型面试问题记录【时序,Qformer,卷积,感受野,ControlNet,IP-adapter】

大模型,多模态大模型面试问题记录24/10/27 问题一:视频生成例如Sora或者视频理解internvl2模型怎么提取时序上的特征。问题二:Qformer介绍训练阶段一训练阶段二 问题三:卷积维度计算公式,感受野1. 卷积层输出高度和宽度…

Spring Cloud --- Sentinel 授权规则

授权规则概述 在某些场景下,需要根据调用接口的来源判断是否允许执行本次请求。此时就可以使用 Sentinel 提供的授权规则来实现,Sentinel 的授权规则能够根据请求的来源判断是否允许本次请求通过。 在 Sentinel 的授权规则中,提供了 白名单…

自修室预约系统|基于java和小程序的自修室预约系统设计与实现(源码+数据库+文档)

自修室预约系统 目录 基于java和小程序的自修室预约系统设计与实现 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师&#x…

asp.net core 入口 验证token,但有的接口要跳过验证

asp.net core 入口 验证token,但有的接口要跳过验证 在ASP.NET Core中,你可以使用中间件来验证token,并为特定的接口创建一个属性来标记是否跳过验证。以下是一个简化的例子: 创建一个自定义属性来标记是否跳过验证: public clas…

【华为HCIP实战课程二十五】中间到中间系统协议IS-IS配置实战续系统ID区域ID,网络工程师

上章简单讲解了ISIS基本配置,本章继续详细讲解ISIS配置及实施 IS-IS配置拓扑 1、R1进行配置IS-IS [R1]display current-configuration configuration isis isis 1 network-entity 49.0124.1111.1111.1111.00 //配置NET地址,由三部分组成,区域ID、系统ID和固定的SEL 00 i…

Kafka集群数据迁移方案

概述 MirrorMaker2(后文简称 MM2)在 2019 年 12 月随 Kafka 2.4.0 一起推出。顾名思义,是为了解决 Kafka 集群之间数据复制和数据同步的问题而诞生的 Kafka 官方的数据复制工具。在实际生产中,经常被用来实现 Kafka 数据的备份&a…

鼠标增强工具 MousePlus v5.3.9.0 中文绿色版

MousePlus 是一款功能强大的鼠标增强工具,它可以帮助用户提高鼠标操作效率和精准度。该软件可以自定义鼠标的各种功能和行为,让用户根据自己的习惯和需求来调整鼠标的表现。 详细功能 自定义鼠标按钮功能:可以为鼠标的各个按钮设置不同的功能…

【大模型系列】Mini-InternVL(2024.10)

Paper:https://arxiv.org/pdf/2410.16261Github:https://github.com/OpenGVLab/InternVL/tree/main/internvl_chat/shell/mini_internvlAuthor:Zhangwei Gao et al. 上海人工智能实验室 文章目录 0 总结(省流版)1 模型结构1.1 InternViT-300M…

探讨Facebook的AI研究:未来社交平台的技术前瞻

在数字时代,社交媒体已成为人们日常生活的重要组成部分。作为全球最大的社交网络之一,Facebook不断致力于人工智能(AI)的研究与应用,以提升用户体验、增强平台功能并推动技术创新。本文将探讨Facebook在AI领域的研究方…