二叉树的顺序结构及实现(堆的实现)

news2024/11/16 21:41:41

一.二叉树的顺序结构:

普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆 ( 一种二叉树 ) 使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。

二.堆的概念及结构:

   堆在物理结构上是数组,逻辑结构上就是完全二叉树。

   堆的性质:
             堆中某个结点的值总是不大于或不小于其父结点的值;
             堆总是一棵完全二叉树。

   1.大堆和小堆的介绍:

   然而堆又分为大堆和小堆。大堆就是父亲节点大于等于孩子节点,小堆就是父亲节点小于等于孩子节点。


如图上面那个就是小堆,下面那个就是大堆。我们可以发现父亲和孩子是有关系的,但是兄弟之间是没有大小关系的。

三.堆的实现:

  1.准备工作:

     

在物理结构上堆就是数组,所以这里有size来记录堆中数据的个数,capacity来记录堆的空间大小

2.堆的初始化:

这里先不给数组开辟空间,当堆里插入数据时再开辟空间。

3.堆的销毁:

堆的销毁就是释放掉给堆存放数据的空间,然后令计数的变量为0即可。

在实现堆的插入时,实际上堆是一个完全二叉树,而堆又分为大堆和小堆,随便插入会导致堆的结构造成破坏,所以我们要提前写一个向上调整和向下调整的算法,来针对是大堆还是小堆的排序。

4.向上调整的算法:

实现向上算法之前,我们将要插入的那个数据的位置视为孩子,利用这个位置找到父亲节点。

上面写了孩子的下标为i,父亲的节点是(i-1)/2  

拿这个图举列子,这个是建立小堆,所以小节点在上面。

这里是按照小堆来调整的,所以当发现父亲比孩子大的数据就交换。

循环交替,互换父亲和孩子的位置,直到孩子的数组下标为0时循环就截至。

里面利用一个自己写的交换函数,然后交换完往上继续就行。

整个代码如图:

这里调整算法传参传的是一个数据类型的指针,而不是结构体指针,就是为了后面写堆排序有用。

现在我们写了向上调整的算法,我们就可以来实现建堆的插入数据的函数。

5.堆的插入:

先建立一个大堆或者小堆,然后插入数据(插入到最后一个叶子节点上),然后利用向上调整算法,使其大堆小堆的性质不发生改变。

还是这个图,当数据成功插入到堆中后,此时调用向上调整算法,需要调整的孩子节点就是刚刚插入的那个数据,就是size-1的位置的数据。

此时我们来调试一下

看看这些数据是否是小堆:

小堆就是父亲节点小于等于孩子节点。这个是完全没有问题的父亲节点都小于孩子节点。

所以这个函数的构造是没有问题的。

6.向下调整的算法:

现在我们给出一个数组,逻辑上看做一颗完全二叉树。我们通过从根结点开始的向下调整算法可以把它调整成一个小堆。 向下调整算法有一个前提:左右子树必须是一个堆,才能调整。
向下调整算法,这里还是建立小堆为例,如果采用向下调整算法的话,就要考虑左节点的孩子节点小还是右孩子的孩子节点小,所以我们这里采用假设法,可以更加便利的写出代码。
利用这个推出来的公式计算。

这里看出向下调整的过程:

首先将那个要插入的数据作为头节点,让其作为父亲节点,向下找孩子节点,然后交换:

然后再将孩子节点传给父亲节点,然后继续往下找,直到孩子节点到达了叶子节点时循环就结束。

  现在来编写代码:

这里的参数n就是代表从堆的哪个节点开始向下调整。

这里有可能会出现越界访问:

当走到后面的父亲节点时,如果是完全二叉树,有可能有没有右孩子的情况,所以这里要加一个限制条件以免越界访问。

这样加了一个限制条件后就不会导致越界访问。

这里的实际意义就是,比如删除堆顶的数据时,此时是小堆,删除堆顶的数据后,再利用向下调整算法,这样就可以把堆里次小的数据找出来了,这样就可以用来排序。

7.堆顶数据的删除:

此时想删除堆顶数据,如果直接将1覆盖会导致怎样的后果呢?

在这里关系就全乱了,原本是兄弟现在变成父子了,所以这里就不是小堆了,所以不能用挪动数据来覆盖。

在这里逻辑结构上的思路就是,你想防止下面的小堆不被打乱,所以这里我们只动堆顶和最后一个数据,我们将这两个数据交换一下:

此时在物理结构上的逻辑就是数组第一个和最后一个交换了一下,然后我们删除数组尾部的数据就特别好删除了。

物理结构上:

直接将记录数组大小的变量减减即可。所以这种办法不会导致关系变得混乱,也能很好的删除堆顶的数据。

交换完数据之后堆顶下边的两个子树还是满足小堆或者大堆,此时就可以使用向下调整算法,让交换完数据的堆还是保持原来的性质。

整个代码如图:

8.取堆顶的数据:

9.堆的判空:

总结:以上博客就是堆的整个实现的过程。

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

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

相关文章

C++入门3——类与对象2(类的6个默认成员函数)

目录 1.类的6个默认成员函数 2. 构造函数 2.1 构造函数的概念 2.2 构造函数的特性 3. 析构函数 3.1 析构函数的概念 3.2 析构函数的特性 4.拷贝构造函数 4.1 拷贝构造函数的概念 4.2 拷贝构造函数的特性 5.赋值运算符重载函数 5.1运算符重载函数 5.2 赋值运算符重…

探索文档解析技术,推动大模型训练与应用

探索文档解析技术,推动大模型训练与应用 0. 前言1. CCIG 20241.1 会议简介1.2 大模型技术及其前沿应用论坛1.3 走进合合信息 2. 大模型时代2.1 大模型的发展与应用2.2 大模型面临的挑战 3. 文档解析技术3.1 文档解析技术难点3.2 TextIn 文档解析算法流程 4. 大模型时…

UE5 Http Server

前言 最近要用UE 作为一个服务器去接收来自外部的请求,从而在UE中处理一些内容,但是之前只做过请求,哪整过这玩意,短期内还得出结果,那怎么搞嘞,本着省事的原则就找找呗,有没有现成的&#xff0…

【基础算法总结】位运算

位运算 1.基础位运算2.常见用法总结3.面试题 01.01. 判定字符是否唯一4.丢失的数字5.两整数之和6.只出现一次的数字 II7.面试题 17.19. 消失的两个数字 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励…

CCIG 2024:合合信息文档解析技术突破与应用前景

目录 背景当前大模型训练和应用面临的问题训练Token耗尽训练语料质量要求高LLM文档问答应用中文档解析不精准 合合信息的文档解析技术1. 具备多文档元素识别能力2. 具备版面分析能力3. 高性能的文档解析4. 高精准、高效率的文档解析文档多板式部分示例 文档解析典型技术难点元素…

Go Modules 使用

文章参考https://blog.csdn.net/wohu1104/article/details/110505489 不使用Go Modules,所有的依赖包都是存放在 GOPATH /pkg下,没有版本控制。如果 package 没有做到完全的向前兼容,会导致多个项目无法运行(包版本需求不同)。 于是推出了g…

JVM学习-类加载过程(一)

概述 在Java中数据类型分为基本数据类型和引用数据类型,基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载按Java虚拟机规范,从class文件加载到内存中的类,到类卸载出内存为止,它的整个生命周期包含以下7…

Java 异常处理中try-catch块、finally子句以及自定义异常的使用

Java 异常处理是 Java 语言中非常重要的一部分,用来处理程序运行过程中可能发生的各种异常情况,确保程序的稳定性和可靠性。 一、Java 异常处理概述 异常是程序运行过程中出现的非正常情况。Java 使用异常类(Exception 类及其子类&#xff…

建WordPress主题官网模板

蓝色的中文WordPress企业模板 https://www.zhanyes.com/qiye/6305.html 暗红色WordPress律师事务所网站模板 https://www.zhanyes.com/qiye/23.html 红色大banner图WordPress外贸网站模板 https://www.zhanyes.com/waimao/27.html

【C语言】探索文件读写函数的全貌

🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C笔记专栏: C笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 🔥引言 本章将介绍文件读取函数的相关知识和展示使用场景&am…

AI自动化办公:批量将Excel表格英文内容翻译为中文

有一个50列的表格,里面都是英文,要翻译成中文: 在ChatGPT中输入提示词: 你是一个开发AI大模型应用的Python编程专家,要完成以下任务的Python脚本: 打开Excel文件:"F:\AI自媒体内容\AI行业…

harbor -- docker私有仓库安装配置

1 安装docker-compose $ curl -L "https://get.daocloud.io/docker/compose/releases/download/v1.25.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose $ chmod x /usr/local/bin/docker-compose 2 安装配置harbor $ wget https://g…

JS-51-Node.js10-yarn

一、yarn的简介 Yarn 是一款 JavaScript 的包管理工具(npm的代替方案),是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具。 正如 Yarn 官网的介绍,Yarn 的具有速度快 、安全 、可靠 的优点&#x…

嘉立创使用gif

新建原理图 边框设置2 新建pcb图 放置焊盘 排列焊盘 新建符号 封号向导 新建封装 封装向导 符号与封装联结 原件查找 drc设计规则(线之间的距离等 布线冲突 顶底层切换 T ,B 顶底连线,自动创造过孔 铺铜 泪滴 网格大小 吸附 元件库

民国漫画杂志《时代漫画》第33期.PDF

时代漫画33.PDF: https://url03.ctfile.com/f/1779803-1248635648-d8235b?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

任何图≌自己这一几何最起码常识推翻直线公理让R外标准实数一下子浮出水面

黄小宁 h定理:点集AB≌B的必要条件是A≌B。 证:若AB则A必可恒等变换地变为BA≌A,而恒等变换是保距变换。证毕。 如图所示R轴即x轴各元点x沿x轴正向不保距平移变为点y2x就使x轴沿本身拉伸(放大)变换为y2x轴不≌x轴&…

PDF盖骑缝章

在PDF文件上加盖骑缝章,您可以采取以下几种方法之一: 使用Adobe Acrobat: 打开Adobe Acrobat软件,加载PDF文件。在工具栏选择“工具”选项,找到“骑缝章”或“印章”工具。选择或上传您的骑缝章图片,将其放…

区块链技术:金融行业的信任基石

一、引言 在数字化转型的浪潮中,区块链技术以其独特的优势,正逐渐成为金融行业的信任基石。本文将深入探讨区块链技术在金融行业的应用,通过具体案例的细化和完善,分析其特点和影响。 二、区块链技术的核心特点 1. 去中心化:区块链技术通过分布式账本,实现去中心化的数…

乡村振兴,教育先行:加强农村教育事业发展,提高农民素质,培育新时代新型农民,为美丽乡村建设提供人才保障

目录 一、引言 二、农村教育事业发展的重要性 1、提高农民素质,促进全面发展 2、推动农村经济社会发展 3、传承乡村文化,促进文化振兴 三、加强农村教育事业发展的策略 1、加大教育投入,改善教育设施 2、普及义务教育,提高…

栈和队列题目练习

本节小编选了两道题来加深对栈和队列的认识理解! 有效的括号 方法1:直接用栈的结构(动态数组) 本题可以用栈这个结构来解答,将(,{,[ 左括号压入栈中,然后取出栈顶元素与右括号),},]匹配。不匹配的话&…