DataStructure--Tree

news2024/12/26 9:28:20

文章摘录链接

1.树基本概念

计算机数据结构中的树就是对显示中的树的一种抽象(倒置现实中的树)。
image

1.1 树

有层次关系N(N≥0)个节点的有限集合

空树:	N=0
非空树:	有且只有一个根节点

1.2 节点

根节点
分支节点
叶子节点

前驱(父节点)
后继(子节点)

1.3 子树

除根外,可分为m个互不相交的有限集合

1.4 边

1.5 度

1.6 高度(深度、层次)

1.7 有序数/无序树

各节点的子树从左至右有/无次序。

2.树的性质

1
节点 = 总度数 + 1
节点的度 = 节点孩子(分支)个数

2
度为m的树:各节点度的最大值为m
	任意节点的度 ≤ m
	至少一个节点的度 = m

3
m叉树的区别:每个节点最多有m个孩子
	任意节点的度 ≤ m
	允许所有节点的度都 < m

image

2.树的存储结构

顺序存储对应的就是数组。
链式存储对应的就是链表。
再复杂的数据结构,要么是数组存储,要么是链表存储,再么是数组+链表存储。
image

2.1树的双亲表示法(顺序存储)

优点:可以快速找到某节点的父节点
缺点:无法快速找到某节点的子节点
image

2.2 树的孩子表示法(顺序存储 + 链式存储)

实际应用:hashmap
image

2.3 树的孩子兄弟表示法(链式存储)

image

3.森林

森林是m(m>0)颗 互不相交 树的集合

既可以顺序存储,又可以链式存储。

森林和二叉树转换:
	森林根节点间是兄弟。

image

4.二叉树

4.1 二叉树定义

Binary Tree.
节点的度 ≤ 2 的有序数。 `二叉树必须是有序的`。

空树、只有根节点的树、只有左子树、只有右子树、左右子树都有

image

4.2 二叉树分类

4.2.1 满二叉树

每一层都铺满,只有最后一层是叶子结点。

高为h,节点数 2^h - 1 。(原来m叉树公式带入而来:(m^h-1)/(m-1) )
只有最后一层有叶子结点
不存在度为1的节点
按层序从1编号,i的左子为2i,右子为2i+1,父为i/2

4.2.2 完全二叉树

从上往下,从左至右。
可以理解为满二叉树去掉最下层右边部分叶子结点的树。
image

4.2.3 二叉排序树

image

4.2.4 平衡二叉树

image

4.3 二叉树的存储结构

4.3.1 顺序存储

是将普通的二叉树当成完全二叉树来存的。并不是说只有完全二叉树才能顺序存储。
image

4.3.2 链式存储

默认删除步骤:
将右侧子节点替换要删除的节点,次之 左侧子节点替换。
image

5.如何访问二叉树

5.1 二叉树的遍历

5.1.1 先序遍历

image

5.1.2 中序遍历

image

5.1.3 后序遍历

image

5.1.4 层次遍历

利用先进先出队列。

5.2 线索二叉树

通过优化存储结构,增加前、中、后序遍历速度。不包含层次遍历。

线索化是指针对某一种遍历方式进行线索化,而不是针对二叉树进行线索化。
同一个二叉树,由于使用的遍历方式不同得到的线索二叉树是不同的。
image

5.2.1 前序遍历

image

5.2.2 中序遍历

image

5.2.3 后序遍历

image

6.二叉树应用场景

6.1 二叉查找树(BST)

6.1.1 概念

image

6.1.2 BST查找

因为BST的概念,查找只会往一个子树的方向查找,故时间复杂度就是层次高度。即O(log2n).

6.1.3 BST插入

先进行查找,确定插入位置。
插入的时间复杂度 = 查找插入位置 + 插入时间复杂度1 = O(log2n)

6.1.4 BST删除

时间复杂度(平均) = 查找插入位置 + 循环查找插入位置 = mO(log2n) = O(log2n)
时间复杂度(最差,当树是个单节点链接链表时)= O(n)
image

分三种情况:
1.删除度为0的节点
	直接删掉
	
2.删除度为1的节点
	将该节点的前驱或后继直接连到该节点所在的位置即可。
	
3.删除度为2的节点
	简单情况:要删除的几点前驱或后继节点的度为0,以按照删除度为1的节点的思路进行节点位置的调整。
	复杂情况:要删除的节点前驱或后继节点的前驱或后继为1或2,思路一样,但需要递归待替换的节点。

6.2 平衡二叉树(AVL)

首先是一个二叉查找树(BST),并增加了平衡要求。
应用实例:hashmap
image

注意:
AVL进行插入或删除会导致失衡,那么相应的引出调整失衡(即旋转)的概念。
调整的应是最小不平衡二叉树

6.2.1 失衡情况(4种)

旋转名字中的方向(如,左单、右单)指的是物理旋转的方向,可根据下面的实例看出来。

6.2.1.1 右单旋转(LL平衡旋转)

此种旋转适用于在当前节点的左孩子节点(第一个L)的左子树(第二个L)进行插入的情况。

注意:
	旋转,挪节点时都以二叉查找树(BST)为前提。

例:如下图,
	当前节点11的左孩子节点的左子树插入节点7.

image

6.2.1.2 左单旋转(RR平衡旋转)

此种旋转适用于在当前节点的右孩子节点(第一个R)的右子树(第二个R)进行插入的情况。

注意:
	旋转,挪节点时都以二叉查找树(BST)为前提。

例:如下图,
	当前节点14的右孩子节点的右子树插入节点16.

image

6.2.1.3 先左后右双旋转(LR平衡旋转)

需要先进行一次左旋转,再进行一次右旋转。
此种旋转适用于在当前节点的左孩子节点(第一个L)的右子树(第二个R)进行插入节点的情况,
以上概念为前提,又分为在该右子树下插入左节点和右节点两种情况。

注意:
	两次旋转,挪节点时都以二叉查找树(BST)为前提。

例:如下图,
	情况1:当前节点15的左孩子节点的右子树插入左节点10.
	情况2:当前节点15的左孩子节点的右子树插入右节点13.

image

6.2.1.4 先右后左双旋转(RL平衡旋转)

需要先进行一次右旋转,再进行一次左旋转。
此种旋转适用于在当前节点的右孩子节点(第一个R)的左子树(第二个L)进行插入节点的情况,
以上概念为前提,又分为在该右子树下插入左节点和右节点两种情况。

注意:
	两次旋转,挪节点时都以二叉查找树(BST)为前提。

例:如下图,
	情况1:当前节点15的右孩子节点的左子树插入左节点16.
	情况2:当前节点15的右孩子节点的左子树插入右节点18.

image

6.3 哈夫曼树

哈夫曼树中没有度为1的节点。
image

哈夫曼树不只有一个,如下图所示

image

6.3.1 哈夫曼树的构造

image

6.3.2 哈夫曼树的应用–哈弗曼编码

计算机间传递数据以二进制流进行,若采取固定长度编码,则会浪费空间。
进而衍生出可变长度编码,但解码会有问题。
最后衍生出前缀编码,
最后利用哈夫曼树得到字符的前缀,最终得到哈弗曼编码。

最终叶子节点带权路径总长度之和就是电文的长度。

image
image

7.树了解流程

参考链接
-> 二叉树 -> 满二叉树 -> 完全二叉树 -> 二叉查找树(Binary Search Tree - BST,又称二叉排序树、二叉搜索树) -> 平衡二叉搜索树 (Balanced binary search trees,又称AVL树、平衡二叉查找树) -> 红黑树(Red - Black Tree,一种自平衡二叉搜索树(BST)) -> B-Tree(B树) -> B+ Tree(B+树)

7.1 红黑树

红黑树,Red-Black Tree 「RBT」是一个自平衡(不是绝对的平衡)的二叉查找树(BST)

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

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

相关文章

MongoDB【MongoRepository MongoTemplate】实现增删改查

目录 1:文章评论 1.1:需求分析 1.2:表结构分析 1.3:技术选型 1.3.1:mongodb-driver 1.3.2:SpringDataMongoDB 1.4:文章微服务模块搭建 1.5:文章评论实体类的编写 1.6&#x…

【计算机网络】为什么 TCP 每次建立连接时,初始化序列号都要不一样呢?

【计算机网络】为什么 TCP 每次建立连接时,初始化序列号都要不一样呢? 为什么 TCP 每次建立连接时,初始化序列号都要不一样呢? 主要原因是为了防止历史报文被下一个相同四元组的连接接收。 TCP 四次挥手中的 TIME_WAIT 状态不是会…

现代操作系统和 TCP/IP(第二篇)

接着 现代操作系统和 TCP/IP 继续。 现代分时系统的时间片轮转机制让人们可以 “同时使用计算机”,从而滋生了 “同时使用网络” 的需求,现代分时系统是分组交换网的原动力。 从来没有超过一个人同时使用同一部电话,因此独占线路的电路交换…

2023蓝桥杯省模拟赛附近最小

2023蓝桥杯省模拟赛附近最小 这个题算是一个经典的数据结构入门题了&#xff0c;写了几个解法水一篇文章 map维护 时间复杂度nlgn&#xff0c;但是常数比较大&#xff0c;所以只能过90%数据 #include <iostream> #include<vector> #include<map> #include…

卖房子真是稳赚不赔

上面是一段很长的语音&#xff0c;对话是用的我们河池的桂柳话&#xff0c;不过桂柳话和普通话有很多相识之处&#xff0c;理解起来并不困难。 大概的意思是 A公司要给员工一批福利房&#xff0c;然后就让开发商来竞标&#xff0c;竞标的时候开发商就会说明清楚到时候给员工的房…

关于stl容器的迭代器失效问题

场景 在项目中使用stl容器的时候&#xff0c;多线程环境下出错&#xff0c;调试很久发现问题是使用容器的时候由于容器扩容导致的线程不安全&#xff0c;还有扩容导致的迭代器失效问题&#xff0c;于是就想着把迭代器失效的问题总结一下。 场景重现1   我在项目开发中使用ve…

【AI帮我写代码,上班摸鱼不是梦】如何调教ChatGPT,让它帮我写程序。

最近发现磁盘空间严重不足&#xff0c;都弹窗提示我了&#xff1a; 想想看到底哪个文件夹占的空间比较大&#xff0c;好做针对性的删除和清理。奈何Windows系统没有查看文件夹大小的工具&#xff0c;只能鼠标放在某个文件夹上&#xff0c;等提示&#xff1a; AI时代都来临了&am…

AttributeError: ‘ChatGLMConfig‘ object has no attribute ‘quantization_bit‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

STM32 产生随机数方式

STM32 产生随机数方式 C语言的stdlib.h库里的srand(unsigned seed)和rand(void)函数&#xff0c;可以配合产生伪随机数。其中srand(seed)产生算法种子&#xff0c;再由rand()通过算法产生随机数&#xff0c;产生的随机数在宏定义RAND_MAX范围内。如果seed不变&#xff0c;则产…

测试从未如此简单:接口自动化测试Python脚本实现

目录 摘要 步骤1&#xff1a;安装依赖项 步骤2&#xff1a;编写测试脚本 步骤3&#xff1a;运行测试 结论 摘要 自动化测试是现代软件开发过程中的重要环节。在许多情况下&#xff0c;特别是在web应用程序和移动应用程序中&#xff0c;接口自动化测试是其基础。下面就来介绍一…

嵌入式就业怎么样?

嵌入式就业怎么样? 现在的IT行业,嵌入式是大热门&#xff0c;下面也要来给大家介绍下学习嵌入式之后的发展以及就业怎么样。 首先是好找工作。嵌入式人才目前是处于供不应求的状态中&#xff0c;据权威统计机构统计在所有软件开发类人才的需求中&#xff0c;对嵌入式工程师的…

详解树与二叉树的概念,结构,及实现(上篇)

目录 一&#xff0c; 树 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 二&#xff0c; 二叉树 2.1二叉树概念 三&#xff0c;特殊的二叉树 1. 满二叉树 2. 完全二叉树 3. 1 二叉树的性质 3. 2 二叉树的存储…

北邮22信通:二叉树层序遍历的两种方法首发模板类交互

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 获取更多文章 请访问专栏~ 北邮22信通_青山如墨雨如画的博客-CSDN博客 目录 一.总纲 二.用队列存储 2.1用模板类实现队列 2.1.1核心思路&#xff1a; …

FL Studio电音编曲软件V21中文完整版 安装下载教程

目前水果软件最版本是FL Studio 21&#xff0c;它让你的计算机就像是全功能的录音室&#xff0c;大混音盘&#xff0c;非常先进的制作工具&#xff0c;让你的音乐突破想象力的限制。喜欢音乐制作的小伙伴千万不要错过这个功能强大&#xff0c;安装便捷的音乐软件哦&#xff01;…

PTA L2-045 堆宝塔 (25 分)

堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小&#xff0c;按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下&#xff1a; 首先准备两根柱子&#xff0c;一根 A 柱串宝塔&#xff0c;一根 B 柱用于临时叠放。把第 1 块彩虹圈…

掌握ChatGPT:全面指南和GPT-3.5与GPT-Plus的对比分析

在人工智能领域&#xff0c;最近的一大重磅炸弹是OpenAI发布了GPT-4架构下的ChatGPT。这款先进的自然语言处理模型已经引起了很多关注&#xff0c;让我们来深入了解怎么使用这个强大的工具&#xff0c;以及比较GPT-3.5与GPT-Plus的差异。 什么是ChatGPT&#xff1f; ChatGPT是…

JavaScript经典教程(三)-- JavaScript -- 基础数据类型详解

183&#xff1a;基础数据类型详解 1、复习 1、全局变量&#xff1a; 依托于window环境下的的变量。 在window大环境下&#xff08;即最外层&#xff09;申明的变量a&#xff0c;即为全局变量。 2、window&#xff1a; window下的变量为全局变量。 window可省略。 3、作用域…

021 - C++ 构造函数

我们继续学习 C 的面向对象编程&#xff0c;本期主要是讲其中的 构造函数。 什么是构造函数呢&#xff1f; 构造函数基本上是一种特殊类型的方法&#xff0c;它在每次实例化对象时运行。 我们直接来看一个例子吧。 例子时间 我们将要通过创建一个 Entity 类来深入了解这个…

vscode python3.6配置pcl点云库 obj3d模型转pcd点云图

配置vscode python3.6的环境我就跳过了,网上都有 1.下载PCL1.9 github:pcl-1.9.1 百度云:PCL-1.9.1-AllInOne-msvc2017-win64提取码adcx 2.安装硬盘任意位置,我是E盘,在安装过程中会弹出openni的安装提示,将它安装路径选择在E:\PCL 1.9.1\3rdParty\OpenNI2,等待安装完成 3.…

.netCHATING 10.4 for NET6-7.0-Crack

.NET 6.0图表支持--dotnetcharting .netCHATING 10.4添加了.NET 6.0图表nuget包和.NET 6.0图表示例包&#xff08;需要Visual Studio 2022&#xff09;&#xff0c;.NET 5是.NET Core 3.1和.NET Framework 4.8的继任者&#xff0c;旨在为.NET开发人员提供新的跨平台开发体验。…