数据结构(5):树和二叉树

1 树的定义

1.1 树的基本概念

分支可以称为边,结点可以用于存放数据结构。

除了根节点,其他节点只有一个前驱!!!!

互不相交也就是 只有一个前驱结点!

树应用的很广的

1.2 结点之间的关系

直接前驱是父节点,路径是单向的【只能从上往下走】

度为0就是叶子结点,度大于0就是非叶子结点!树的度-各结点的最大值!

1.3 有序树和无序数

家谱按照出生的顺序

1.4 树和森林

m棵不相交的树

2 树的性质

结点数 = 总度数+1 

这个1其实就是根结点

度为m的数和m叉树的区别

度为m的树最多结点

高度为h的m叉树最多结点

就素等比数列

度和叉树

具有n个结点的m叉树的最小高度

3 二叉树概念【高频】

满二叉树 完全二叉树

注意满二叉树的坐标规律!!!!【有利于以后的顺序存储!!】

在满二叉树的基础上去掉序号大的结点!

完全二叉树最多只有一个度为1的结点!!

二叉排序树

搜索就会简单哦!插入一个元素还可以是二叉排序树。二叉排序树可用于元素的排序、搜索!

平衡二叉树

更平衡会得到更高效的搜索效率!!!长的越胖越好

4 二叉树的常考性质

4.1 二叉树

叶子结点的个数 = 二分支结点的个数+1

二叉树的第i层最多结点

高度为h的二叉树最多结点

4.2 完全二叉树

结点为n的完全二叉树高度

给出总结点推出度为0、1、2的结点个数

n0 = n2+1 则n0+n2 = 2n2 +1 那么意思就是n0+n2一定是奇数

总结

4.3 二叉树的存储结构

4.3.1 顺序存储

完全二叉树

非完全二叉树

4.3.2 链式存储

总结

5 二叉树的遍历

5.1 二叉树 先/中/后序遍历

遍历:按照某个次序把所有的结点都访问一下

先序遍历也叫做先根遍历!

分支结点逐层展开法【写序列】

手算的时候一层一层的写!!!!【分支结点逐层展开法!】

中缀表达式是没有界限符的!!!

代码

从你的全世界路过法【写序列】

空间复杂度0(h+1)

A B D G  E C F 第一次路过的时候就访问结点!!!

中序:D G B E A F C  第二次路过的时候访问结点

后序:第三次路过的时候

用从你的全世界路过法:就是画出路径你就懂了:【类似这样的】

应用:求树的深度

5.2 二叉树的层序遍历

代码:

保存的是指针这样节省空间!

5.3 由遍历序列构造二叉树

只有当两个进行组合的时候才可以确定一个二叉树!!!【必须有中序序列

!】

先写左子树 再写根节点 最后写右子树!

只给一个不可以,但是任意两个进行组合就可以!!!

前序+中序

先圈出根结点!!!!

前序的第一个一定是根节点!!!!!

后序+中序

先找根节点:最后一个出现的就是根结点!!!!原理和之前相同!!!

层序+中序

根节点:层次序列里先出现的就是根结点!

如果不要中序序列是不可以的!

6 线索二叉树【难但重要!!】

6.1 线索二叉树的作用

第一个问题:对于普通的二叉树 必须从根节点开始遍历才可以,不能从任意的一个节点出发进行遍历

第二个问题:找到指定结点的前驱和后继是很不方便的

所以给出了中序线索二叉树

6.2 中序线索二叉树

把空链利用起来,一共有n+1个空链【n指的是结点的个数!!!】

意义:找前驱和后继就会很方便,遍历也很方便,因为遍历其实就是不断的找后继结点的过程!

这里的前驱和后继指的是在中序遍历序列中的前驱和后继!!不是父节点子节点哦

对于优点的指向的是后孩子的结点如何找到他的后继呢?【在后边会把这个坑填上!】

6.3 线索二叉树的存储结构

ltag==1说明是线索!

6.4 二叉树的线索化【代码实现!!】

6.4.1 土方法找中序前驱

6.4.2 中序线索化

线索化的过程其实和“土方法”是一样的,只不过每走一步就要判断一下是否有空链有就连上线索!

判断时:

【pre时p的前驱】看pre的右节点是否为空,空的话就连上p;看p的左节点是否为空,空的话连上pre

注意这个过程中没有最后一个结点的右指针指向null,需要做特殊处理!

下面是完整的代码!:

pre定义成局部遍历了,用引用之后会改变pre的值,和在外面定义一个是一样的!

6.4.3 先序线索化

会出现爱的魔力转圈圈的问题

完整代码:【也要对最后一个结点做特殊处理!】

6.4.4 后序线索化

不会出现爱的魔力转圈圈的问题!

6.5 在线索二叉树里找前驱和后继

更方便二点找到前驱和后继!!!

后序后继,和前序前趋 都需要能找到父节点才可以!!!!【用三叉链表或者土办法才可以】

中序后继

当tag=0的时候进行展开,注意展开到挨着“根”就停止了!

当有右孩子的时候,这个结点的后继结点就是p右子树的最左下的结点!!!

中序前驱

左子树的最右下的节点!!时刻确定tag

先序后继

如果有左孩子那么就是左孩子,如果没有左孩子那么只能是右孩子!

先序前驱

当ltag = 0时,就找不到前驱了,只能通过土办法进行寻找,因为没有往回指的指针了!【当可以找到父节点的话此局可解!】

如果能找到父节点的话:

对于3优先往右走,如果可以走通就一直走,走不了就向左拐下去就一直到最后一层就是它的前驱!!!

后序前驱

后序后继

只能用土办法!!!如果可以找到父节点的话此局也可解

7 树和森林

7.1 树的存储结构

二叉树的顺序存储:

是否可以推广到普通的树呢?

7.1.1 树的存储1:双亲表示法【顺序】

拓展:

优缺点:

找父节点【很方便!!!】,找孩子结点【只能遍历一下数组!!!】

7.1.2 树的存储2:孩子表示法【顺序+链式】

firstchild:指向第一个孩子编号!

用一个链表记录一个节点的孩子编号!

拓展:孩子表示法存储森林

服务流程树:

中文服务请按1,英文服务请按2.....按完之后又会接着要求按什么?直到找到具体的服务

7.1.3 树的存储3:孩子兄弟表示法【纯链式存储】

从用孩子兄弟表示法的结果来看很像二叉树!

拓展:孩子兄弟表示法存储森林

树根视为平级的兄弟关系

7.2 树、森林与二叉树的转换【重要】

7.2.1 树转二叉树

一层一层的处理,串冰糖葫芦!

7.2.2 森林转二叉树

7.2.3 二叉树转树

把冰糖葫芦先圈出来,然后 按照二叉树的层数放冰糖葫芦!

7.3 树和森林的遍历

8.2 森林转二叉树

树是一个递归定义的东西!

7.3.1 树的先根遍历【深度优先遍历】

这个路径优先往左走,然后每到一个就visit

7.3.2 树的后根遍历【深度优先遍历】

路径也是优先往左往下走,当第二次路过该节点的时候visit

7.3.3 树的层次遍历【广度优先遍历】

可以发现路径是尽可能一层一层的遍历的!所示可以看作是广度优先遍历

7.3.4 森林的先序遍历

森林这种数据结构适合树相互递归定义的!

注意递归的时候:第二部如果访问到的还是森林的话会回到第一步!

7.3.5 森林的中序遍历[看不懂如何递归的!!!!!!]

8 树与二叉树的应用

8.1 哈夫曼树【数据的压缩】

重要在哈夫曼树的构造!和哈夫曼的应用--哈夫曼编码!

只计算所有叶子节点!

哈夫曼书的定义:

如何构造呢?

更小的先结合!

一共需要合并n-1次,每次合并都会出现一个新的结点则哈夫曼树一共有2n-1个结点!

同样的叶子节点可以构造出不同的哈夫曼树

哈夫曼树的经典应用:哈夫曼编码

有没有比这个方案更有效的方案呢?

能不能更简单呢?

右边的编码可能会导致解码错误!

因此对可变长度编码时,所有的字符集对应的字符必须作为叶子结点不能作为中间的结点!

前缀编码:没有一个编码是另一个编码的前缀!

因此哈夫曼树可以用于数据的压缩!

8.2 并查集

各个集合之间是互不相交的,两个元素只有两种关系:一个是从属于同一个集合,一个是在不同的集合里

怎末用代码实现这样的数据结构呢?

使用森林:同一个集合中的元素组成树!

查:一路向上找到根节点!找根即可

并让一个树称为另一棵树的子树!

树的存储:双亲表示法、孩子表示法、孩子兄弟表示法。【双亲表示法会更适合实现并查集】

双亲表示法可以很快的找到父节点方便进行并和查的操作

8.2.1 存储结构

8.2.2 基本操作

是集合的具体实现

8.2.3 代码实现

【1】初始化

【2】并查

并的操作:是传入两个根节点的编号

【3】时间复杂度

find最坏时间复杂度:o(n),和树的高度有关,则如果对算法进行优化,意思就是让树长的不要那么瘦高!

【4】union优化(让小树合并到大树上就不会增加树的高度了)

大树小树:用根节点的绝对值表示树的结点总数!

树的高度不会超过

8.3 并查集的终极优化

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

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

相关文章

DBeaver Ultimate 22.1.0 连接数据库(MySQL+Mongo+Clickhouse)

前言 继续书接上文 Docker Compose V2 安装常用数据库MySQLMongo,部署安装好之后我本来是找了一个web端的在线连接数据库的工具,但是使用过程中并不丝滑,最终还是选择了使用 DBeaver ,然后发现 mongo 还需要许可,又折…

为什么idea建议使用“+”拼接字符串

今天在敲代码的时候,无意间看到这样一个提示: 英文不太好,先问问ChatGPT,这个啥意思? IDEA 提示你,可以将代码中的 StringBuilder 替换为简单的字符串连接方式。 提示信息中说明了使用 StringBuilder 进行…

专业视频拍摄与编辑SDK,定制专属视频解决方案

无论是社交媒体营销、产品展示、教育培训还是直播电商,高质量的视频内容都是吸引眼球、传递信息的关键。美摄科技,作为视频编辑处理领域的佼佼者,以其强大的视频拍摄与编辑SDK,为企业开启了视觉创意的新篇章。 【专业级功能&…

leetcode-148. 排序链表

题目描述 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4]示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5]示例 3&#x…

2024钉钉杯A题思路详解

文章目录 一、问题一1.1 问题1.2 模型1.3 目标1.4 思路1.4.1 样本探究1.4.2 数据集特性探究:1.4.3 数据预处理1.4.4 数据趋势可视化1.4.5 ARIMA和LSTM两种预测模型1.4.6 参数调整 二、问题二2.1 问题2.2 模型2.3 目标2.4 思路2.4.1 样本探究2.4.2 数据集特性探究2.4…

电路学习——开关电源TL431(2024.07.21)

参考链接1: 【硬件学习笔记003】玩转电压基准芯片:TL431及其他常用电压基准芯片 参考链接2: TL431工作原理、经典应用电路、输出产生真的的原因分析 参考链接3: 如何确定开关电源TL431反馈回路的参数 参考链接4: 反激电源——TL431及光耦反馈电路计算(不…

网络安全防御【IPsec VPN搭建】

目录 一、实验拓扑图 二、实验要求 三、实验思路 四、实验步骤: 修改双机热备的为主备模式: 2、配置交换机LSW6新增的配置: 3、防火墙(FW4)做相关的基础配置: 4、搭建IPsec VPN通道 (1…

监控系列(八)部署dameng_exporter并对接prometheus

一、下载dameng_exporter采集器 官网地址:https://github.com/gy297879328/dameng_exporter DM数据库适配prometheus监控的采集器,目前已支持DM8数据库同时提供grafana 8.5.X 以上版本的监控面板(其他的grafana版本需要自己绘制表盘&#x…

二十、Qt位置相关函数

目录 一、函数概述 二、函数实践 三、总结 一、函数概述 Qt 提供了很多关于获取窗体位置及显示区域大小的函数,如 x()、y()和 pos()、react()、size()、geometry()等,统称为“位置相关函数”或“位置函数”, 如下图所示是几种主要的位置函数…

模拟ADG主库归档文件丢失,备库出现gap(增量备份解决)

文章目录 一、说明二、环境信息2.1.主备库环境信息2.2.检查主备是否同步正常 三、模拟日志断档3.1.模拟主库归档文件丢失3.2 查看主库状态出现GAP 四、RMAN增量备份恢复备库同步4.1 RMAN增量恢复备库4.2 开启备库redo同步4.3 主备库验证同步 一、说明 模拟Oracle主库归档文件丢…

Encountered 1 file(s) that should have been pointers, but weren‘t:

https://stackoverflow.com/questions/71236993/git-lfs-cannot-discard-file-changes-encountered-files-that-should-have-been-poi 这个答案works

mysql查询语句优化

目录 1.背景 2.解读explain 2.1.id详解 1.id相同 2.id不相同 3.id有相同也有不相同 2.2.select_type详解 1.SIMPLE 2.PRIMARY 3.DERIVED 4.SUBQUERY 5.DEPEDENT SUBQUERY 6.UNCACHEABLE SUBQUERY 7.UNION 8.UNION RESULT 2.3.table详解 2.4.type详解 1.system…

HarmonyOs之 路由简单跳转

Navigation路由相关的操作都是基于页面栈NavPathStack提供的方法进行,每个Navigation都需要创建并传入一个NavPathStack对象,用于管理页面。主要涉及页面跳转、页面返回、页面替换、页面删除、参数获取、路由拦截等功能。 Entry Component struct Index …

MySQL数据库练习(5)

1.建库建表 # 使用数据库 use mydb16_trigger;# 表格goods create table goods( gid char(8) primary key, name varchar(10), price decimal(8,2), num int);# 表格orders create table orders( oid int primary key auto_increment, gid char(10) not null, name varchar(10…

QtCreator和QtDesignStudio最佳实践

一、QTC和QDS工作流概述 很多初学者对 QDS(Qt Design Studio) 和 QTC(Qt Creator)如何配合经常存有疑问,本文介绍具体的工作流程。 工作流程 1.产品设计:通过PS、Figma、XD等专业工具设计页面视觉和原型。 2.QDS 原型制作:导入设计源文件、…

50.TFT_LCD液晶屏驱动设计与验证(3)

(1)数据生成模块Verilog代码: module data_gen(input [9:0] hang ,input [9:0] lie ,input clk_33M ,input reset_n ,output reg [23:0] data ); //定义最大行、列parameter …

数据结构篇4—递归实现二叉树基础结构

文章目录 前言🚩1、树?2、树的相关概念3、树的结构表示4、二叉树🚀、概念和结构🎁、特殊二叉树 5、二叉树常用性质6、二叉树的存储结构🧩、顺序存储结构🎨、链式存储结构 7、二叉树顺序结构的实现----堆8、…

m4a怎么转mp3?m4a转mp3的几种方法教程

m4a怎么转mp3?M4A音频格式的全称MPEG-4 Audio,是一种音频压缩格式。这种格式以其卓越的音质和相对较小的文件大小而广受欢迎,尤其是在音乐存储、在线流媒体以及音频编辑等领域。M4A格式被广泛应用于苹果公司的产品中,如iPhone、iP…

MDIO读写测试实验

目录 一.以太网 1.1以太网概述 1.2以太网的分类 1.3以太网的接口类型 1.4RJ45接口定义 1.5以太网连接图 二.MDIO接口 2.1MDIO概述 2.2MDIO接口连接图 2.3MDIO接口的帧格式 2.4MDIO 接口读时序图 2.5MDIO 接口写时序图 三.以太网 PHY 芯片(YT8531&#x…

SpringBoot中使用监听器

1.定义一个事件 /*** 定义事件* author hrui* date 2024/7/25 12:46*/ public class CustomEvent extends ApplicationEvent {private String message;public CustomEvent(Object source, String message) {super(source);this.message message;}public String getMessage() …