数据结构--二叉树和堆

目录

1.基本概念

2.树的遍历方法

3.满二叉树&&完全二叉树

4.逻辑结构&&物理结构

5.推理公式

6.二叉树应用--堆

7.简单实现堆


1.基本概念

(1)这个里面的概念还是比较多的,但是大部分我们只需要了解即可,因为这个我们在离散数学里面已经学习过一些理论知识,这个地方就不在进行这个详细的赘述了;

(2)重点就是知道这个叶子结点和终端节点,双亲节点,孩子节点,树的高度,树的高度是从1开始的,这个是和离散数学里面相互区别点一个点,重点记忆一下就行了;

(3)每一个树都是有很多的节点组成的,但是这个节点都有自己的分支,我们把一个节点的分支的个数叫做这个节点的度,其中所有节点里面的度数的最大值就是这个树的度;

2.树的遍历方法

(1)我们知道这个树肯定是有这个val表示这个节点的数值,但是这个具体要定义多少个指针,这个是不确定的,因为我们的这个树的节点的个数是不确定的;

(2)这个时候一个很厉害的定义方法就出来了,不是这个树里面的节点个数不确定吗,这个时候我们只需要定义两个节点,一个节点就是左边节点,一个节点就是右边节点;

(3)在实现这个数据结构的时候,我们只需要先定义一个指针指向这个左边的节点,让后通过一个循环,让这个节点指向他右边的兄弟节点,如果没有的话就会直接到下一个父节点,这个就可以实现这个树的遍历;

3.满二叉树&&完全二叉树

(1)满二叉树:每一个节点都有两个子节点,一个是左边的节点,一个是右边的节点;

(2)完全二叉树:上面的每一层都是满的,但是最后一层没有满,满二叉树就是特殊的完全二叉树,后面的大部分介绍对于这个满二叉树通常都是使用的完全二叉树;

4.逻辑结构&&物理结构

(1)我们之前学习这个链表就介绍过这个逻辑结构和物理结构,这个逻辑结构就是这个我们自己想的图,例如这个脸表里面不同的节点之间使用一个有方向的箭头相互连接,实际上真实存在的这个链表之间通过指针就会直接找到下一个节点了,这个箭头就是我们认为的构想出来的,实际上就是不存在的;

(2)在二叉树里面,我们的这个完全二叉树(实际上是满二叉树)也是我们认为臆想出来的,在真实存储的时候,这个是使用数组的方式进行存储的;

(3)对于一个数组的序列,我们也是可以快速地画出它的逻辑结构的,直接按照这个父子节点的顺序排列即可;

5.推理公式

(1)通过一个数组,我们可以画出对应的逻辑结构,我们接下俩就是想要得到通过这个父节点的下标,找到这个子节点的下标,通过子节点的下边,推理出来这个父节点的下标;

(2)已知这个父节点下标i,左子树就是i*2+1,右子树就是i*2+2,已知这个子树的下标j,这个时候他的父亲节点的下标就是(j-1)/2因为这个进行的除法运算,这个时候即使两个子节点对应同一个父亲节点,这个也是可以计算出来的;

(3)我们上面介绍的这个满二叉树的逻辑结构就是一个数组,但是对于一个完全二叉树(非满二叉树),如果还是使用数组进行表示,这个时候就会造成这个空间的浪费,因为这个,满二叉树和完全二叉树都是有顺序的,我们对于这个完全二叉树里面没有节点的位置,就相当于是浪费一个数组的空间,因为这个地方如果放数据,我们上面的这个父子节点下标的推理公式就不成立了;

6.二叉树应用--堆

(1)这里的堆是一种数据结构,和我们之前在C语言里面说的malloc在对堆上面开辟空间的“堆”虽然写法是一样的,但是真正的意义是不一样的,malloc是操作系统里阿米的一个区域,我们在这个区域上面开辟内存空间,和这里的数据结构对截然不同,我们在数据结构里面学习的堆是用来排序的,是一种算法;

(2)堆的分类:大堆和小堆,这个定义是根据这个子节点和父亲节点val值的大小确定的,当一个二叉树里面的任何一个父亲节点的数值都大于这个子节点的,我们就称之为一个大堆,反之就是一个小堆;

(3)通过观察我们不难发现,小堆根是最小的,大堆的根是最大的,这个就可以找到一组数据里面的极值,后续我们回去学习这个如何把一个不是堆序列的数据经过这个顺序的变换使之成为这个大堆或者小堆,或者说是这个本来开始就是一个堆序列,经过数据的添加删除之后,他依然还是一个堆序列;

(3)堆的实质就是一个完全二叉树,这个就是堆和二叉树的联系;

7.简单实现堆

(1)头文件

typedef int HPDataType;typedef struct Heap
{HPDataType* a;int size;int capacity;
}HP;void Swap(HPDataType* p1, HPDataType* p2);
void AdjustUp(HPDataType* a, int child);
void AdjustDown(HPDataType* a, int n, int parent);void HPInit(HP* php);
void HPDestroy(HP* php);
void HPPush(HP* php, HPDataType x);

这个里面包括这个数组的初始化,销毁,数据的插入,向上调整,向下调整;

(2)对一个简单的对堆,实际上就是一个数组,只不过结构上面更加体系化,我们想要插入数据,如果这个数据插入之后,原来的小堆还是小堆,这个直接插入即可,但是如果不是,我们就需要调整,因为这个小堆的父节点的值小,说明我们这个时候插入的数据比这个父节点还小,我们就需要要向上调整,把这个插入的节点和祖先节点进行比较,直到满足这个小堆的定义才停止;

因为我们插入的数据更加小,这个函数实现的就是向上调整;

void AdjustUp(HPDataType* a, int child)
{// 初始条件// 中间过程// 结束条件int parent = (child - 1) / 2;//while (parent >= 0)while (child > 0){if (a[child] < a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}

(3)如果我们想要实现堆的删除,这个地方的删除不是删除最后一个节点,这样的话直接size--即可,完全没有其他必要了,我们要删除的是这个堆顶部元素节点;

删除的方法就是把这个堆的顶部节点和这个最后一个节点互换,我们再size--把这个节点删除,这个时候堆的顶部节点删除了,但是这个时候肯定是不满足堆的定义的,因为我们把这个堆顶元素换掉了啊,我们这个时候就需要把这个节点向下进行查找,直到符合这个堆的定义才停止;仔细观察我们会发现,这个实际上就是一个简单的排序了,但是这个还不是真正的堆排序,但是前期阶段我们可以这样进行理解;

下面是这个向下调整的实现代码:

void AdjustDown(HPDataType* a, int n, int parent)
{// 先假设左孩子小int child = parent * 2 + 1;while (child < n)  // child >= n说明孩子不存在,调整到叶子了{// 找出小的那个孩子if (child + 1 < n && a[child + 1] < a[child]){++child;}if (a[child] < a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}

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

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

相关文章

【Linux进阶】文件系统5——ext2文件系统(inode)

1.再谈inode (1) 理解inode&#xff0c;要从文件储存说起。 文件储存在硬盘上&#xff0c;硬盘的最小存储单位叫做"扇区"&#xff08;Sector&#xff09;。每个扇区储存512字节&#xff08;相当于0.5KB&#xff09;。操作系统读取硬盘的时候&#xff0c;不会一个个…

数智化配补调:零售品牌增长新引擎

随着科技的不断进步和消费者需求的日益个性化、多元化&#xff0c;传统服装行业正面临着前所未有的挑战与机遇。在这个快速变化的时代&#xff0c;如何精准把握市场脉搏&#xff0c;实现库存的高效管理&#xff0c;成为了服装品牌生存与发展的关键。数智化配补调策略应运而生&a…

广州佛山中山数据中心机房搬迁公司

随着数据中心的发展和迭代&#xff0c;必然面临数据中心搬迁。数据中心搬迁听来简单&#xff0c;其实涉及诸多方面&#xff0c;如信息迁移的安全性、业务的连续性、搬迁的规范性、方案的可行性、组织的统一性等。友力科技&#xff08;广州&#xff09;有限公司&#xff0c;自原…

快速解决找不到krpt.dll,无法继续执行代码问题

对于那些遇到计算机开机出现由于无法找到krpt.dll&#xff0c;进而无法继续执行代码问题的用户。 krpt.dll是计算机系统中与DirectX紧密相关的重要文件&#xff0c;如果它出现问题&#xff0c;可能会对一些特定的软件或游戏的运行产生影响。实际上&#xff0c;我们有多种解决该…

音视频开发35 FFmpeg 编码- 将YUV 和 pcm合成一个mp4文件

一 程序的目的 /*** *该程序的目的是: * 将 一个pcm文件 和 一个 yuv文件&#xff0c;合成为一个 0804_out.mp4文件 * pcm文件和yuv文件是从哪里来的呢&#xff1f;是从 sound_in_sync_test.mp4 文件中&#xff0c;使用ffmpeg命令 抽取出来的。 * 这样做的目的是为了对比前…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第55课-芝麻开门(语音 识别 控制3D纪念馆开门 和 关门)

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第55课-芝麻开门&#xff08;语音识别控制3D纪念馆开门和关门&#xff09; 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtn…

搜狐新闻HarmonyOS版本 push 推送开发

背景 搜狐新闻作为HarmonyOS的合作伙伴&#xff0c;于2023年12月成功上架鸿蒙单框架应用市场&#xff0c;成为首批鸿蒙应用矩阵的一员。 新闻类推送作为应用的重要组成部分&#xff0c;在二期规划中&#xff0c;我们将推送功能列为核心功能模块。本文将推送集成过程中的步骤和…

C++左值右值

在C中&#xff0c;左值&#xff08;lvalue&#xff09;和右值&#xff08;rvalue&#xff09;是表达式分类的关键概念&#xff0c;它们主要影响表达式的赋值、函数调用以及操作符的使用方式。这些概念在C11及以后的版本中变得更加重要&#xff0c;因为引入了移动语义和右值引用…

秋招提前批面试经验分享(上)

⭐️感谢点开文章&#x1f44b;&#xff0c;欢迎来到我的微信公众号&#xff01;我是恒心&#x1f60a; 一位热爱技术分享的博主。如果觉得本文能帮到您&#xff0c;劳烦点个赞、在看支持一下哈&#x1f44d;&#xff01; ⭐️我叫恒心&#xff0c;一名喜欢书写博客的研究生在读…

华为仓颉可以取代 Java 吗?

大家好&#xff0c;我是君哥。 在最近的华为开发者大会上&#xff0c;华为亮相了仓颉编程语言&#xff0c;这是华为历经 5 年&#xff0c;投入大量研发成本沉淀的一门编程语言。 1 仓颉简介 按照官方报告&#xff0c;仓颉编程语言是一款面向全场景智能的新一代编程语言&#…

嵌入式开发SPI基本介绍与应用

目录 #SPI通信协议 #SPI基础概念 #SPI通信模式 #SPI通信时序类型 前言&#xff1a;本篇笔记参考嘉立创的开发文档&#xff0c;连接放在最后。 #SPI通信协议 #SPI基础概念 Serial Peripheral Interface 缩写SPI 翻译&#xff1a;串行外设接口 同步串行通信协议&…

保研复习 | 数据结构

目录 CH1 绪论☆ 数据项、数据元素、数据结构☆ 逻辑结构和存储结构的区别☆ 顺序存储结构和链式存储结构的比较☆ 算法的重要特性☆ 算法的复杂度 CH2 线性表☆ 单链表 CH3 栈、队列和数组☆ 栈和堆是什么&#xff1f;☆ 栈在括号匹配中的应用☆ 栈在表达式求值中的应用☆ …

【因果推断】优惠券政策对不同店铺的影响

这次依然是用之前rossmann店铺竞赛的数据集。 之前的数据集探索处理在这里已经做过了&#xff0c;此处就不再赘述了CSDN链接 数据集地址&#xff1a;竞赛链接 这里探讨数据集中Promo2对于每家店铺销售额的影响。其中&#xff0c;Promo2是一个基于优惠券的邮寄活动&#xff0c;发…

基于Python API的机械臂UDP上报设置及读取

睿尔曼机械臂提供了1个可持续读取机械臂状态的接口&#xff0c;UDP通信状态反馈接口。 该接口提供了json协议、API的读取&#xff0c;设置通信开启之后无需再进行设置即可以固定频率读取。 Python程序源码可从以下网盘地址获取&#xff08;地址永久有效&#xff09;&#xff1…

基础权限存储

一丶要求 建立用户组shengcan&#xff0c;其id为 2000建立用户组 caiwu&#xff0c;其id 为2001建立用户组 jishu&#xff0c;其id 为 2002建立目录/sc,此目录是 shengchan 部门的存储目录&#xff0c;只能被 shengchan 组的成员操作4.其他用户没有任何权限建立目录/cw,此目录…

51单片机-第一节-LED和独立按键

一、点亮LED&#xff1a; 首先包含头文件 <REGX52.H> 随后令P2为0xFE。(此时二进制对应1111 1110&#xff0c;为0 的LED亮&#xff0c;故八个灯中的最后一个亮起)。 注&#xff1a;P2为控制LED的8位寄存器。 void main() {P2 0xFE;//1111 1110while(1){} } 二、L…

微信小程序简历Demo

微信小程序简历Demo 使用介绍最后获取源码 bilibili视频介绍 使用介绍 使用微信小程序实现的一个简历实现Demo 拖动马里奥&#xff0c;到指定Name下方 向上顶就可以显示对应的简历样式 点击头像可拨打电话 点击信息处可显示当前位置 最后 这是一个简单并且有趣的微信小程…

acwing 291.蒙德里安的梦想

解法&#xff1a; 核心&#xff1a;先放横着的&#xff0c;再放竖着的。 总方案数&#xff0c;等于只放横着的小方块的合法方案数。 如何判断当前方案是否合法&#xff1f;所有剩余位置&#xff0c;能否填充满竖着的小方块。 即按列来看&#xff0c;每一列内部所有连续的空着的…

Cyber Weekly #14:WAIC 2024

赛博新闻 1、WAIC2024开幕&#xff1a;一半机器人&#xff0c;一半大模型 7月4日&#xff0c;AI界春晚——2024世界人工智能大会&#xff08;WAIC 2024&#xff09;在上海开幕&#xff0c;大会展示了500家企业的1500项展品&#xff0c;突出了机器人和大模型技术。国产机器人和…

使用Keil将STM32部分程序放在RAM中运行

手动分配RAM区域,新建.sct文件,定义RAM_CODE区域,并指定其正确的起始地址和大小。 ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************…