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

news2024/11/14 3:24:49

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://www.coloradmin.cn/o/1950384.html

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

相关文章

微服务实践和总结

H5原生组件web Component Web Component 是一种用于构建可复用用户界面组件的技术&#xff0c;开发者可以创建自定义的 HTML 标签&#xff0c;并将其封装为包含逻辑和样式的独立组件&#xff0c;从而在任何 Web 应用中重复使用。 <!DOCTYPE html> <html><head…

Python | Leetcode Python题解之第283题移动零

题目&#xff1a; 题解&#xff1a; class Solution:def moveZeroes(self, nums: List[int]) -> None:n len(nums)left right 0while right < n:if nums[right] ! 0:nums[left], nums[right] nums[right], nums[left]left 1right 1

springboot游戏化教育平台-计算机毕业设计源码92424

游戏化教育平台设计与实现 摘 要 游戏化教育平台是一种融合了游戏元素和教育内容的创新型教育工具&#xff0c;旨在提升学习者的学习兴趣和参与度。本论文基于SpringBoot框架&#xff0c;设计并实现了一款游戏化教育平台。该平台包括用户和管理员两大功能模块。对于用户功能而…

Linux开启coredump

在Linux系统中&#xff0c;C/C程序崩溃是常见的问题之一。Coredump是指当一个程序崩溃时&#xff0c;系统把程序运行时的内存数据以二进制文件的形式保存下来&#xff0c;以便程序开发者进行崩溃分析。本文将介绍如何开启并配置Coredump 1、查看并配置coredump 在Linux系统中…

mac M1安装Roop教程及所遇到的问题

1.安装miniconda&#xff0c;下载地址&#xff1a; 按 Python 版本划分的最新 Miniconda 安装程序链接&#xff1a;https://docs.anaconda.com/miniconda/miniconda-other-installer-links/ 下载后直接默认安装即可。 我用的是&#xff1a;Python3.10对应的Miniconda 2.下载…

在 ArchLinux 上编译运行 axmol 引擎

本文将在 Windows 10 上安装 Arch WSL 中编译 axmol 请确保 WSL2 已正确安装 1. 在微软应用商店安装 ArchLinux 2. 打开 Arch&#xff0c;按照提示输入用户名和密码&#xff0c;尽量简单 3. 配置清华源&#xff0c;速度快的起飞&#xff0c;否则&#xff0c;各种包会安装失败…

C++必修:模拟实现STL之string

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 为了让我们更加深入理解string&#xff0c;接下来我们将模拟实现一个简易版的stri…

力扣高频SQL 50题(基础版)第十七题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第十七题1075. 项目员工 I题目说明思路分析实现过程准备数据实现方式结果截图 力扣高频SQL 50题&#xff08;基础版&#xff09;第十七题 1075. 项目员工 I 题目说明 项目表 Project&#xff1a; ----------------…

四、GD32 MCU 常见外设介绍 (2) GPIO 模块介绍

2.GPIO 模块介绍 GPIO的全称为通用输入输出口&#xff0c;是很多外设能够正常工作的必要条件。除了一些特定功能的引脚(如电源脚)外&#xff0c;MCU上其他的引脚都可以当做GPIO来使用。本章&#xff0c;我们将对GPIO进行简单介绍&#xff0c;并通过一个“流水灯”的实验来熟悉…

力扣刷题-图论-岛屿类问题-集合实现(c++实现)

我的老师&#xff1a;力扣链接这道题题解中最高赞的回答nettee&#xff0c;从这篇题解中我学到了dfs框架以及解决思路&#xff0c;并独立完成了该题解里的几道习题本人刷题的习惯是学会一个板子&#xff0c;然后之后的同类题都机械的用这个板子去做&#xff0c;最好不做创新&am…

广州某展厅门牌创新案例:1*2 OLED柔性屏的精致应用

在广州这座繁华都市的心脏地带&#xff0c;一座现代感十足的展厅悄然矗立&#xff0c;其独特的门牌设计成为了过往行人目光的焦点。这座展厅的门牌采用了前沿的1*2 OLED柔性屏技术&#xff0c;不仅展现了科技与艺术的完美融合&#xff0c;更彰显了展厅的高端定位与创新精神。 项…

容器 string 的模拟实现

容器 string 的模拟实现 开篇解释代码实现&#xff1a;myString.h 头文件myString.cpp 实现文件 模拟实现 string 能对 STL 有更深刻的认识&#xff0c;底层了解越丰富&#xff0c;使用起来越顺手 接下来我会以 .h 头文件以及其 .cpp 的实现文件展示其大致模拟&#xff0c;这只…

【代码】Python3|Scrapy框架初探(汽车之家大连市二手车车辆数据爬取、清洗与可视化)

本篇主要是整个项目的介绍&#xff0c;没提到太多琐碎的技术细节&#xff0c;以后有空的话会整理一下 Scrapy 和原生爬虫的差异&#xff0c;还有它坑人的一些地方&#xff0c;单发出来。 开源地址&#xff1a;https://github.com/shandianchengzi/car_home_spider 使用说明&a…

学习日记:数据类型2

目录 1.转义字符 2.隐式类型转换 2.1 强制类型转换 2.2 不同类型间赋值 3.运算符 表达式 3.1 算术运算符 3.2 算术运算优先级 3.3 赋值运算 3.3.1 不同类型间混合赋值 3.4 逗号运算 4.生成随机数 5. 每日一练 1.转义字符 \n 表示换行 \t …

Vue3可媲美Element Plus Tree组件实战之移除节点

Element Plus Tree自定义节点内容示例中介绍了移除节点的用法&#xff0c;个人觉得作为提供给用户API&#xff0c;应该遵循迪米特法则&#xff0c;把功能实现的细节封装在组件内部&#xff0c;而提供给用户最简单的操作方式&#xff0c;同时在此基础上支持用户的扩展。 因此&a…

ITK-中值滤波

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 中值滤波原理 中值滤波是一种常用的非线性滤波技术&#xff0c;用于去除图像中的噪声&#xff0c;特别是椒盐噪声和脉冲噪声。它…

MM 7 -采购- 询报价

思维导图 说明 sap提供了 询价 报价和比价的功能。 不建议在sap管理。一般引导不在sap管理。 流程&#xff1a; 操作 询价 ME41 报价ME47 比价ME49 拒绝 对于不符合条件的报价进行拒绝 生成信息记录 后台表 Ekko ekpo 。采购凭证类别&#xff1a;A

csa笔记6-网络管理命令

nmcli命令 字符终端&#xff0c;可以立即生效且重启系统后配置也不会丢失 nmtui命令 可视终端&#xff0c;立即生效&#xff0c;重启有效 network.service 管理网络 RHEL 7 以前&#xff1a;使用network.service管理网络 RHEL 7&#xff1a;使用network.service和Netwo…

Docker(十一)-Docker运行nginx1.10容器实例

1.下载镜像 docker pull nginx:1.102.直接启动实例(目的&#xff1a;复制出配置文件) 2.1启动实例 docker run -d -p 80:80 --namenginx1.10 nginx:1.102.2将容器内文件拷贝到本地目录 docker cp nginx1.10:/etc/nginx /software/nginx/将/software/nginx/nginx目录改为/so…

07 JSP

文章目录 JSP1、JSP 概述2、JSP 脚本和缺点3、EL 表达式4、JSTL标签5、MVC模式和三层架构6、案例 JSP 1、JSP 概述 JSP&#xff08;全称&#xff1a;Java Server Pages&#xff09;&#xff1a;Java 服务端页面 &#xff08;1&#xff09;是一种动态的网页技术 &#xff08;2&…