树 相关知识

C++中树相关知识大全 一、树的基本知识 (1)概念 **树**:树是一些节点的集合。这个集合可以是空集;若集合不是空集,则树由根节点r以及0个或多个子树组成。 **边**:两个节点之间的连线就是边。 **树叶**:没有儿子的节点称为树叶。 **节点的度**:节点拥有的子树数称为节点的度。 **度**:节点的度的最大值称为树的度。 ... 阅读详情

二叉树 树的任意节点最多两棵子树。

完美二叉树 perfect 除了叶子结点,每个节点都有两个孩子,每层也是完全填充的。

完整二叉树 complete 除了最后一层之外的其他层都被完全填充,并且所有节点都保持向左对齐。

完满二叉树 full 除了叶子结点外每个节点都有两个孩子。

完全二叉树中,若一个结点没有左孩子,则它必是树叶

答案:T

分析:

首先明确完全二叉树的定义:如果编号i(1≤i≤n)的结点与满二叉树(完美二叉树)中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。

图1为完美二叉树(满叉树),图2为完全二叉树,两树相同序号的结点在树的位置上相同,而图三6号位置与图一位置不同,则它不是完全二叉树。

所以完全二叉树如果没有左结点,则一定没有右结点,即没有左孩子,它就一定是树叶。

完满二叉树

二、二叉查找树(二叉搜索树、二叉排序树、BST)[这几个都是别名]

若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
任意节点的左、右子树也分别为二叉查找树;
没有键值相等的节点。

二叉搜索树的性能分析

1、插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。

2、但对于同一个关键码集合,如果各关键码插入的次序不同,可能得到不同结构的二叉搜索树:

最优情况下,二叉搜索树为完全二叉树,其平均比较次数为:O(log n)

最坏情况下,二叉搜索树为右单支,其平均比较次数为:O(n / 2)(1~n)

三、平衡二叉树

它具有以下两个性质:

  • 可以是空树。

  • 假如不是空树,任何⼀个结点的左子树与右子树都是平衡⼆叉树,并且高度之差的绝对值不超过 1。

平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),它的性质很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。

第一张图:8的左子树高度为2,右子树高度为0,失衡
第二张图:13的左子树高度为3,右子树高度为1,失衡
第三张图:每一个结点的左右子树高度差绝对值不超过1,平衡
于是,图1、图2不是平衡二叉树,图3是平衡二叉树。
另外,对于图1和图2:分别只有结点13、8失衡,其他结点都平衡。

3.插入

平衡因子

某结点的左子树与右子树的高度(深度)差即为该节点的平衡因子(BF,Balance Factor)。平衡⼆叉树中不存在平衡因子大于于 1 的节点。

在⼀棵平衡⼆叉树中,节点的平衡因子只能取0、1、-1
0 :左右子树等高
1:左子树比较高
-1 :右子树比较高

3.2旋转

我们给出的方法是旋转这个树。怎么旋转呢?先别急,我们先介绍一个概念,以帮助我们更好的解释旋转。

最小失衡子树:在新插入的结点向上找,以第一个平衡因子绝对值大于1的结点为根的子树称为最小失衡子树。例如:上树中以父节点13的根的树为最小失衡子树。

显然,这时候13也是整课树的根结点,但往往更多的时候,失衡结点也不一定是全树的根结点,很可能只是某一部分子树失衡了,所以我们也只需要调整失衡的子树,其他部分不用调整。那么是怎么调整的呢?

平衡二叉树的失衡调整主要是通过旋转最小失衡子树来实现的,旋转分为左旋和右旋,其目的,就是减少树的高度(哪边高,就把那边向上旋转)。

3.2.1左旋—右孩子右子树

结点的右孩子替代此结点的位置
右孩子的左子树变成结点的右孩子
结点本身变成右孩子的左子树

以下图为例,在插入结点20后。结点13发生了失衡,需要对13为父节点的子树进行旋转,由于插入的位置是在13右孩子的右子树上,所以我们通过左旋的方式来实现。

通过上述操作,我们把15向上旋转了,让原本的父节点13作为了15的左孩子,此时就变成了三叉树,需要将15原本的左子树接到13的右孩子处(这样,15也是二叉树,14的位置也是对的)

3.2.2右旋-左孩子左子树

那如果是在左孩子的左子树插入结点导致失衡的呢?就采用与右旋相对应的左旋(右与左互换)。

结点的左孩子替代此结点的位置
左孩子的右子树变成结点的左孩子
结点本身变成左孩子的右子树

通过上述操作,我们把8向上旋转了,让原本的父节点13作为了8的右孩子,此时就变成了三叉树,需要将8原本的右子树接到13的右孩子处(这样,8也是二叉树,10的位置也是对的)

3.2.3先左旋再右旋-左孩子右子树

这里我们解决了两种插入方式了,但还有两种,如果是在左孩子的右子树或者右孩子的左子树插入导致失衡呢?我们接着看。

左孩子的右子树,即在10的位置插入了元素9,导致13失衡,而插入结点9在13的左孩子8的右子树上。此时,我们先对13的左孩子8左旋,再对13右旋。其中,左右旋操作即3.2.1与3.2.2介绍的操作。

3.2.4先右旋再左旋-右孩子左子树

那如果是右孩子的左子树插入呢?我们依然采用相对应3.2.3的方式(左右互换)。

插入元素14,14按理应放在15后面,于是导致了13失衡。先对失衡结点13右孩子18右旋,再对13左旋。

3.3总结

根据以上四种插入方式,旋转方式总结如下:

插入方式

描述

旋转方式

LL

在结点A的左孩子的左子树插入导致A失衡

右旋

RR

在结点A的右孩子的右子树插入导致A失衡

左旋

LR

在结点A的左孩子的右子树插入导致A失衡

先左旋再右旋

RL

在结点A的右孩子的左子树插入导致A失衡

先右旋再左旋

注意:“先左旋”旋转的是失衡结点的左子树,“再右旋”旋转的是失衡结点。

4.删除

在介绍完插入操作后,我们自然地应该来看看删除操作。删除的思想也同二叉排序树,但需要注意的是删除结点可能会导致树失衡,而且删除此结点,可能导致其他很多结点都失衡。也就是说:插入只需要修正第一个非平衡结点(1个),即可平衡;而删除需要修正所有的非平衡结点。

所以,它比插入操作更复杂,但没关系,我们继续分类讨论:

删除结点的类型:
删除叶子结点
删除结点只有左子树
删除结点只有右子树
删除结点有左、右子树

4.1删除叶子结点

将该节点直接从树中删除
其父结点的子树高度的变化将导致父节点平衡因子的变化,通过向上检索并推算其父节点是否失衡;
如果其父节点未失衡,则继续向上检索推算其父节点的父节点是否失衡…如此反复步骤2的判断,直到根结点;如果向上推算过程中发现了失衡的现象,则进行步骤 4;
如果其父结点失衡,则判断是哪种失衡类型 [LL、LR、RR、RL] ,并对其进行相应的平衡化处理。如果平衡化处理结束后,发现与原来以父节点为根结点的树的高度发生变化,则继续进行步骤2的检索推算; 如果与原来以父结点为根结点的高度⼀致时,则可说明父结点的父结点及祖先结点的平衡因子将不会有变化,因此可以退出处理

4.2删除结点有左子树或右子树

将左子树(右子树)替代原有结点8的位置
结点8被删除后,则以8的父结点13为起始推算点,依此向上检索推算各节点(父、祖先)是否失衡
如果其父结点未失衡,则继续向上检索推算其父节点的父结点是否失衡…如此反复步骤2的判断,直到根结点 ;如果向上推算过程中发现了失衡的现象,则进行步骤4的处理
如果其父结点失衡,则判断是哪种失衡类型 [LL、LR、RR、RL] ,并对其进行相应的平衡化处理。如果平衡化处理结束后,发现与原来以父结点为根结点的树的高度发生变化,则继续进行步骤2的检索推算; 如果与原来以父结点为根结点的高度⼀致时,则可说明父结点的父结点及祖先结点的平衡因子将不会有变化,因此可以退出处理

4.3删除结点有左右子树

找到被删结点10和替代结点 9 (结点10 的前继结点或后继结点 ——此处选择前继)
将替代结点9 的值赋给结点 10 ,再把替代结点9的左孩子7替换替代结点9的位置
以9的父结点 6为起始推算点,依此向上检索推算父结点或祖先结点是否失衡
如果其父结点未失衡,则继续向上检索推算其父节点的父节点是否失衡…如此反复③的判断,直到根结点;如果向上推算过程中发现了失衡的现象,则进行⑤的处理
如果其父节点失衡,则判断是哪种失衡类型 [LL、LR、RR、RL] ,并对其进行相应的平衡化处理。 如果平衡化处理结束后,发现与原来以父节点为根节点的树的高度发⽣变化,则继续进行 ② 的检索推算;如果与原来以父结点为根结点的高度⼀致时,则可说明父节点的结节点及祖先结点的平衡因子将不会有变化,因此可以退出处理

6.1LL

6.2RR

6.3LR

6.4RL

13、数据结构中的树相关知识详解 本文详细解析了数据结构中与树相关的知识点,包括树节点的删除操作、哈夫曼树的构建及其应用(如哈夫曼编码)、线索二叉树的类型与操作(遍历、插入和删除)、AVL树及其四种平衡旋转操作。此外,文章还总结了不同树结构的特点与应用场景,并通过实际案例分析了它们在数据压缩、数据库索引等领域的应用价值。 阅读详情

相关推荐

量化投资之工具篇一:Backtrader从入门到精通(1)-手把手教你零基础实现一个策略案例

Backtrader是重要的量化框架,本文记录学习该框架的笔记,内容主要基于Backtrader的网站指导文档。虽然该框架目前用于量化投资领域,但是可以作为数据处理的基本架构,进行改造后用于各种数据的处理,尤其适用于对原始数据处理完成后应用一定的策略进行预测以及可视化处理。 1、简介 Backtrader的特点,就是两点: 1、易于使用; 2、参见第1条。 那么如何使用Backtrader呢?比把大象装进冰箱复杂点,一共4步: 创建一个Cerebro引擎: 加入一个Strategy...

仓鼠王的博客 5万+

完全二叉树中,若一个结点没有左孩子,则它必是树叶

完全二叉树中,若一个结点没有左孩子,则它必是树叶

qq_62210937的博客 1557

Star CCM+中的物性参数(定值、多项式、查表)

仿真过程中我们一定会遇到设置物性参数的问题,对于固定的物性参数还好说,直接输入一个固定的值即可。但是对于冷却液、气体、两相流等,物性参数是随着温度或温度和压力变化的。此时就涉及到多项式和查表。首先创建物理连续体,选择计算模型。

2201_75375391的博客 2958

完全二叉树的判定

/* *完全二叉树的判定:对二叉树进行层次遍历,在遍历过程中对每一个结点进行检查: * (1)如果当前结点没有右子树,则剩下的全部结点必须既没有左子树,又没有右子树; * (2)如果当前结点有右子树,则它必须也有左子树. */ #include

shijiemoxing的专栏 727

生态位宽度计算&可视化展示(R语言)

物种的生态位越宽,该物种的特化程度就越小,倾向于泛化种(generalist species);物种的生态位越窄,倾向于是一个特化种(specialists species)。生态位宽度是指物种(或其它生物单位)在群落中所利用的各种不同资源的总和。本篇所使用为生态位宽度指数即**Levins的生态位宽度指数。

weixin_53705272的博客 4435

MOS管开关设计知识-(五种MOS管开关电路图方式)

在使用MOS管设计开关电源或者马达驱动电路的时候,大部分人都会考虑MOS的导通电阻,最大电压等,最大电流等,也有很多人仅仅考虑这些因素。这样的电路也许是可以工作的,但并不是优秀的,作为正式的产品设计也是不允许的。 下面是我对MOSFET及MOSFET驱动电路基础的一点总结,其中参考了一些资料,非全部原创。包括MOS管的介绍,特性,驱动以及应用电路。 1、MOS管种类和结构 MOSFET管是FET的...

树卡花 7万+

二叉树的基础部分分析

什么是二叉树 二叉树( binary tree )是树的一种特殊形式。二叉,顾名思义,这种树的每个节点最多有2个孩子节点。注意,这里是最多有2个,也可能只有1个,或者没有孩子节点。 二叉树节点的两个孩子节点,一个被称为左孩子(left child),一个被称为右孩子(right child)。这两个孩子节点的顺序是固定的,就像人的左手就是左手,右手就是右手,不能够颠倒或混淆。 什么是满二叉树 一个二叉树的所有非叶子节点都存在左右孩子,并且所有叶子节点都在同一层级上,那么这个树就是满二叉树。 (叉树的所有叶

经验分享 2951

PX4与ROS协同仿真:从键盘控制到无人机自主飞行

本文详细介绍了如何搭建PX4与ROS协同仿真环境,实现从键盘控制到无人机自主飞行的完整流程。通过XTDrone项目整合PX4飞控、ROS通信框架与Gazebo物理引擎,逐步讲解环境配置、键盘控制实现原理,并深入剖析了迈向Offboard模式实现自主飞行的核心代码与数据流,为无人机算法开发与测试提供了安全的仿真沙盒。

weixin_29169899的博客 498

chapter 5-4 树与森林

树的表示法 双亲表示法 -1表示根节点。 孩子表示法 孩子兄弟表示法 注意,此种表示法是将树和森林转化为二叉树的写法。即对于每个结点,其lc为它的第一个孩子,rc代表的子树为它的兄弟结点。 树,森林与二叉树转换 见书P162. 关于遍历问题: 树的先根遍历 即先访问根结点,再访问树的子节点(从左往右),对于每一颗子树也如此。 树的先根遍历序列,与将其转化为二叉树之后的先序序列相同。 树的后根遍历 即先从最左结点开始,从左往右访问子节点,最后访问根节点。 树的后根遍历序列,与将其转化为二

weixin_43562123的博客 292

生物信息学投稿避坑指南:如何根据影响因子和审稿速度选择最适合的期刊

本文为生物信息学研究者提供全面的期刊投稿策略,重点解析影响因子、审稿速度等关键指标,帮助选择最适合的期刊。涵盖算法开发类和应用型研究的投稿路径,分析不同出版社特点及开放获取的利弊,并提供投稿全流程优化建议,助力高效发表研究成果。

weixin_42652674的博客 379

可控异常的契约化设计:在 ABAP 中用 CX_STATIC_CHECK 把可预期错误变成接口的一部分

文章摘要: 本文探讨了ABAP系统中异常处理的工程化设计原则,强调将可预期的业务异常作为接口契约的一部分。核心观点是:对于调用方能够合理处理的错误情况,应使用继承自CX_STATIC_CHECK的受检异常,通过方法签名强制调用方处理或显式转发。文章对比了ABAP三大异常根类的适用场景,提出"三问法"判断异常是否适合受检处理,并给出了包含上下文信息的异常类实现示例。通过Fiori文件上传案例,展示了如何在分层架构中合理传递和转换异常,最终在OData服务层将业务异常映射为标准错误响应。这种

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3071

树相关知识点

一.树的相关定义1.(树的定义就不写了)树的定义是递归的,即在树的定义中又用到了自身,树是一种递归的数据结构。2.特点:树的根结点没有前驱,除根结点外的所有结点有且只有一个前驱。树中所有结点可以有零个或多个后继.3.基本术语树中一个结点的孩子个数称为该结点的度,树中结点的最大度数称为树的度度大于0的结点称为分支结点(又称非终端结点);度为0(没有子女结点)的结点称为叶子结点(又称终端结点)。4.树的性质5.度为m,具有n个结点的树的最大高度h为n-m+1。

Y2663438690的博客 1201

KEPServerEX物联网网关(IoT Gateway)REST客户端代理(非原创)

(中文版)资料来源于【OPC-KEPServerEX学习KEPWare交流】905485143群的【455196383】【零下一度】 一。KEPServerEX物联网网关REST客户端代理演示 在KSE中,首先构建一个带有通道/设备/标签的模拟器系统。 例如,下面是三个随机项目。 直接到IoT网关插件,添加新代理。 从类型列表中选择REST Client。 终结点...

-雲飛兄-博客 5808

树相关知识

二叉树前提是一棵树,也就是需要满足我们树的定义的同时,还需要满足以下要求每个节点 最多有两个子节点,分别是左子节点和右子节点。注意我们这里提到的是最多,所以二叉树并不是必须要求每个节点都有两个子节点,也可以有的仅有一个左子节点,有的节点仅有一个右子节点。下面我们来总结一下二叉树的特点· 每个节点最多有两棵子树,也就是说二叉树中不存在度大于2的节点,节点的度可以为0,1,2。· 左子树和右子树是有顺序的,有左右之分。· 假如只有一棵子树,也要区分它是左子树还是右子树。

weixin_59357128的博客 670

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

树的相关知识总结——JAVA

数据结构总结–树(JAVA) 树的相关知识总结 重新学习数据结构时,对树的一些较为重要的算法和知识点做一个总结,发此博客巩固知识,如果能帮助到大家,那么不胜荣幸。 树的概念 树是n(n >= 0)个结点组成的有限集合,其构成条件是: (1)有且只有一个特定的成为根的结点 (2)其余的结点可以分为若干个互不相交的有限集合,每个集合又是一棵树,我们称其为子树 接下来是关于树的一些专业名词,结合下图会更容易理解: 度:一棵树的子树之和,如A有B,C,D三棵子树,故A的度为3,同理C的度为0。 深度(层数/

weixin_47125742的博客 307

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

浅谈图论中树及其相关知识点(树的遍历、直径、最近公共祖先)(c++)

树的直径是指树中最长的一条简单路径一棵树可以有多条直径可以用DFS或者树形DP在On时间内求出一棵树的直径对于有根树T的两个结点u、v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u和v的祖先且x的深度尽可能大。在这里,一个节点也可以是它自己的祖先。

2301_79587247的博客 1364

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

MySQL索引、B+树相关知识总结

在 B+树中,非叶子节点不存储数据,只存储键值,这意味着非叶子节点可以拥有更多的键,从而有更多的分叉。 这导致树的高度更低,进一步降低了查询时磁盘 I/O 的次数,因为每一次从一个节点到另一个节点的跳转都可能涉及到磁盘 I/O 操作。

python全栈 3907

B树相关知识

1.B树(B-树)基本概念 2.b树的基本简单代码 package 高级数据结构; /** * @author 小徐 * @createTime 2020/4/18 14:39 * @description */ public class BTree { static final int M = 5;//M阶树 static final int MaxSize = (M...

qq_43505820的博客 206

树的相关知识整理

树 二叉树 二叉查找树 2-3查找树 一棵2-3查找树或为一棵空树,或由一下结点组成: 2-结点,含有一个键(及其对应的值)和两条链接,左链接指向的键都小于该结点,右链接指向的键都大于该结点。 3-结点,含有两个键(及其对应的值)和三条链接,左链接指向的键都小于该结点,中链接指向的键都位于该结点的两个键之间,右链接指向的键都大于该结点。 2-3查找树插入总结: 先找插入结点,若结点有空(即2-结...

night李的博客 341

B树的相关知识点

1. B树的所有节点孩子节点个数的最大值成为B树的阶,通常使用m表示,从查找效率上看,要求m >= 3,一棵m阶的B树或者是一棵空树,满足下面的几个要求: ① 每个节点最多有m个分支(子树),而最少分支数需要看是否是根节点,如果是根节点而且不是叶子节点,则至少存在有两个分支,非根非叶节点至少存在 m / 2向上取整个分支 ② 有n个分支的节点有n - 1个关键字,它们按照递增顺序排列(节...

二哈 4228

树的相关知识

树的相关知识

SUNKKLL的博客 433

数据结构——树 相关知识

树作为最重要的数据结构之一,有很多相关的知识mark在此用以查阅 树 树是一种层次结构,形如一个倒立的树。根节点在最上方,叶节点向下延申。其中最常用的树为二叉树,即每个节点最多有两个子节点。 空树 当节点为0时,则称该树为空树 树的深度 仅有一个根节点的树的深度为1,其他依次类推(从上往下) 树的高度 从叶节点到树根节点(从下往上) 平衡二叉树(Balanced Bi...

weixin_38909544的博客 275

R树的相关知识

转自:http://blog.youkuaiyun.com/houzuoxin/article/details/16113895    R树在数据库等领域做出的功绩是非常显著的。它很好的解决了在高维空间搜索等问题。举个R树在现实领域中能够解决的例子吧:查找20英里以内所有的餐厅。如果没有R树你会怎么解决?一般情况下我们会把餐厅的坐标(x,y)分为两个字段存放在数据库中,一个字段记录经度,另一个字段记录纬度。

hao_rh的博客 458

树的定义以及相关知识

树是n个节点的有限集合T,若n=0则称为空树,否则: 有且只有一个特殊的称为树的根结点; 若n>1,其余的结点被分为m个(m>0)互不相交的子集T1,T2....Tm,其中每个子集本身又是一颗树,称其为根的子树。 1.结点:树的结点包含一个数据元素及若干指向其子树的分支。 2.结点的度:结点拥有的子树个数成为结点的度。 3.树的度:树的度是树内各结点的度的最大值。 4.叶子节点(终端结点):度为0的结点称为叶子或终端结点。(后面为空的结点) 5.非终端结点(分支结...

YaWenSg的博客 802
上一篇: RestController与Controller联系与不同
下一篇: 设计模式记录
哥哥笑哈哈
博客等级 码龄6年 2粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值