如果您想学习二进制树,则需要知道什么是树
树是非线性数据结构。它是由n(n> = 0)组成的层次关系集合的集合。
它之所以称为树,是因为它看起来像一棵倒立的树,也就是说是根,而你们面朝下。它具有以下特征:
看它不是一棵树:
节点的程度:节点中包含的子树的数量称为节点的程度;如上图所示:A是6
D的程度为1,E为2 ...
树的程度:在树上,最大的节点的程度称为树的程度;如上图所示:树的程度为6
A是最大的节点,除了A不大,因此是6;
叶节点或末端节点:具有0度的节点称为叶子节点;如上图所示:b,c,h,i ...和其他节点是叶子节点
父母节点或父节点均均为:如果一个节点包含子节点,则该节点称为其子节点的父节点;如上图所示:A是B的母节
儿童节点或子节点:节点中包含的子树的根节点称为节点的子节点;如上图所示:B是A的子节点
根节点:在树中,父母没有节点。如图所示:上面:
节点的级别:从根开始,根是第一层,根的子节点是第二层,依此类推。
这是4层
树的深度:节点中节点的最大级别
树的高度:最大的深度是高度
非末端节点或分支:不是0度的节点;如上图所示:d,e,f,g等。节点是分支节点
兄弟节点:带有家长节点的节点称为兄弟节点;如上图所示:i,j是兄弟节点的表弟节点:父母是同一层节点上的堂兄;如上所示
节点的祖先:从根部的分支上的所有节点到所有节点;如上图所示:A是所有节点的祖先
后代:在植根于某个节点的子树中的任何节点上,都称为节点的后代。如上所示:所有节点都是一个后代
森林:未与M相交的树木集合(M> = 0)称为森林(一棵树称为两棵树和两棵树,称为森林)
树结构的相对线性表更加复杂,并且存储更麻烦。实际上,有很多方法可以指示实际树中的树,例如:父母的陈述,
儿童,儿童兄弟等。LET只是理解最常用的儿童兄弟。
照片示例:A的孩子是B,A没有兄弟节点(null),B的兄弟节点是c ...
我们经历了很多树木,例如以下内容:
只是了解层与一层之间的关系
二进制树是有限的节点集合。该集合要么是空的,要么是带有根节点的二进制树,还有两张专辑和右子树。
二进制树的特征:
上图提供了几棵特殊的二进制树。从左到右:空的树,只有一个只有根节点的二进制树,只有左侧子的节点,只有右和右子树木的节点,一般的二进制树。通常,通过结合上述基本形式来形成二进制树腹部。
看完整的二进制树k是4、2、15和15的4、2,完整的二进制树只有15个节点,也就是说,当每一层填满时,它是完整的二进制树。
什么是完整的二进制树?相交的每次从左到右的每次不是完整的二进制树?您可以看到它。请注意,这些数字是从左向右放置的。一旦存在差距,它就不是完整的二进制树。
完整的二进制树也是一个特殊的完整二。
例如,深度为4 2^k -1 == 16-15节点
上面的8个叶子节点上的8个非叶子节点为7 8 = 7+1;
(5-1)/2 = 2
二进制树的存储结构分为:类似于链接列表的顺序存储和链存储。
二进制树的链存储是通过节点一一引用的。代表的常见方法是二进制和三叉神经的方法。详情如下所示:
在孩子的父母说序言是在平衡树位置中引入的,本文使用孩子的陈述来建造二进制树。
SO被称为遍历的是指沿特定搜索路线的搜索路线,该搜索路线是在树上的每个节点中进行的,只有一次访问。
访问节点的操作取决于特定的应用程序(例如:打印节点内容,节点内容加1)。遍历是二进制树上最重要的操作之一,也是二进制树上其他操作的基础
因此,二进制树的遍历是最基本的。我希望每个人都会来看~~
在穿越二进制树时,如果没有达成一定的协议,每个人都会以自己的方式穿越它,而它们的结果更加混乱。
如果根据一定规则达成协议,则同一树的遍历的结果必须相同。根节点,遍历节点的以下序列具有以下遍历方法:
我不需要在这里记住。如果您不知道在哪里可以看到n,n是正面,以前的顺序已遍历,并且正确的顺序被遍历..........................................................................................
因为被访问的节点必须是子树的根,n(节点),l(左子树)和r(右子树)可以解释为根,根,左子树和roots.nlr,lnr和LRN也称为第一遍历,中根和后根。
序曲中流动流程图:根据箭头号:root-“ left-”右
认识null
注意这一点的前奏
最后一个前提序列的结果是:abcef
中阶遍历流程图:根据箭头号码
当您遇到零回报时,您可以注意序言。当您遇到最左侧的印刷品时,根部正在打印,最后打印到右侧
该顺序与前奏相同,但是打印的时机不同
最后结果:DBAECF
实时 - 序列流程图:根据箭头编号
认识null
请注意帖子 - 序列的遍历,左右右打印,首先向左走,然后向右走,最后打印根。
最后的结果是:DBEFCA
结论是否在中间和背部进行遍历,遍历路径是相同的,但是访问的时间是不同的。
写一个主题,让我们尝试查看上述学习方式:答案如下:
前言:Abdehcfg中线:左右DBEHAFCG后订单:左右根DHEBFGCA
您可以查看答案是否与您的答案相同。应该注意的是中间阶。实际上,该E也是一个根节点,但左为空。
我们必须准备使用代码来创建二进制树,并使用较差的创建。实际上,创建二进制树一段时间的代码不是最终的创建方法,只是一个示例。
查看以下代码:
我们需要创建的树是这样的:
因此,这是代码中的创建:
接下来,让我们看一下要实施的操作:
以上代码看起来很简单吗?
让我们谈谈特定的想法:因为这是先前的遍历,所以顺序是。首先,根部等于null?另一个功能
这等同于空返回,返回到上一个D的节点,对吗?
因此,D的左侧是完成的,它会转到d?Intercectionsome的右侧,人们不明白为什么是D的权利,因为上述代码是这样的重新函数返回,然后在右边,如果它在右边出来,它将返回到B,它将转到B的右树,因此每个节点的左和右都将打印到!交叉定义,这是先前订单的遍历。让我们看一下正常的代码:
结果:A B D E H C F G,结果与我们手动发现结果相同:结果是相同的:
谈论这个想法:中间序列的遍历是
看一下代码:
如果未向下传递b,然后继续进行:然后通过:root是空的,请结束D的前面D:然后开始此步骤,即打印D,然后D的右侧D为NULL,然后到达在D的右边,然后到达D的右侧,然后到达D的右侧,然后到达D的右侧,然后到达D的右侧,然后到达D的右侧。,然后进入D的右侧,然后到达D的右边,然后到达D的右边,然后到达D的右侧,然后到达D的右侧,然后到达D的右边,然后到达D的右边,然后到达D的右边,然后到达D的右边,然后转到它。Flower括号表明所有D都已经结束并开始使用B中节点的左右和右,因此它在中间序言中遍历。
这是子问题的想法:这是一个大问题。
查看结果:作为手动结果:完全相同
让我们谈谈这个想法:假设根已经是D。结束了,现在我们要走了。B的第二个代码是e,但是e的左侧是无效的。当您返回时,您将转到E的第二个代码,也就是说,转到H到H之后,它是无效的。执行H的第三个代码:
打印h,然后返回到上一个打印e,
以上是关于过程的
结果:
(4)遍历想法 - 节点的数量
这个想法非常简单:每次您不打电话给空调时,大小会添加1个
(5.)子问题想法 - 节点的数量
对这个想法的分析:解决此问题的基本原理是,左侧的节点数量和右侧的节点数量将检查左和右节点是否每次可用。计数的效果。
(6)穿越想法 - 叶子的节点数量
思想分析:通过遍历方法,叶子节点是指左侧,并且没有右节点(请参见下面的DHFG)。到节点,您必须判断它是否是叶子节点。
(7)子问题的想法 - 叶子的节点数量
想法:也就是说,左侧的叶子在右侧添加叶子节点。每次生成新功能时,都会判断它是否是叶子节点。如果是上面的返回1,则左边完成后,向右转,然后转到右侧。
图片的想法:
假设我们到达最后一个节点是根
目前,执行判决和返回1的代码;
现在b返回1,然后下一步执行e节点。e的节点为null,但右树没有,所以我们去了h tree.h满足叶子节点,因此执行以下代码并返回1
只需添加它以完成
(8)子问题的想法找到K层的节点的数量
想法:假设我们是3岁,需要第三层中的节点数量。然后,就子问题而言,这等同于找到A左树的第二层和右树的第二层,因此我们可以绘制我们要解决的问题,此问题只需要找到K-左树的1层和右树的K-1层。当k = 1时,它已经是k层。目前,如果添加节点,左右树,您可以找到它。
(9)获取二进制树的高度
想法:找到左数的高度和右树的高度。您可以看到代码上有一个1加1。如果最后一棵树已经完成,它将添加1,最后最大值为1。
第二个代码是添加1。
(10)找到val所在的节点,但没有返回null
想法:首先查看当前基础的值,在左侧找到所有树节点,如果您找不到null,则可以找到它。如果您找不到它,请向右转,也找不到返回空。
链接器
想法:这里给出的是列表< Integer >类型,因此我们需要一个列表来安装它。首先判断它是否为无效。如果Null返回IST,请注意,每个递归将生成一个新的列表值。如果没有保存,建议像我一样写它。
在线OJ
中订单与前奏相同,您需要注意中间订单是左根和右
在线OJ
帖子订单与中订单相同。您需要注意帖子 - 订单是左右根的
在线OJ标题
解决方案的想法:取决于这两棵树是否相同,您必须根据结构和价值遵循判断。下图显示了两棵树之间的区别。
在线OJ标题:
想法:如果要解决此问题,我们可以使用上一个问题的答案来帮助解决问题。字符包含。注意2个数字无效。
话题:
想法:从树下的孩子树的高度是多少?如果左右树高度的绝对值大于1,则证明它不是平衡的二进制树,返回负1
在线OJ
想法:发现它可能不是对称的二进制树。
1. Elefttree或Righttree是空的
2. Elefttree和Righttree的值不同
最后,如果是对称的,则应避免上述条件
左树的左子树与右树的右子树相同,而左树的右树则与右树的左树相同。
二进制树的根节点的层数为1,层序列遍历的层序列来自二进制树所在的二进制树的根节点。第一个访问第一层的根节点,然后从左到右访问二楼的节点,然后第三层是第三个节点。层节点(从上到下)访问访问节点的过程从左到右的树是遍历层。
层-to -layer遍历我们可以使用队列实现以下内容:队列(高级第一)用于使用代码仿真来实现:
结果:
在线OJ
回答:
想法:从这个主题可以找到列表中的列表。使用队列层横穿。每个元素都记录其大小。创建一个新的列表存储元素以弹出。最后,将新列表添加到ret.Array
想法:我们知道完整的二进制树是这样的。我们可以使用分层遍历。看队列,如果二进制树是完全二进制的,则队列为空
但是实际上,最后一个节点后面有一个空。我们可以使用此零来确定是否有元素。如果有元素,则不是完整的二进制树。
在线OJ
首先,让我们看一下主题的含义:初步遍历,空间特征代表空树,几乎是下面的图片
想法:ACM模式下的代码是由您自己手动输入的。键入错字更容易。应该注意。这个问题的关键是如何创建二进制树。以下代码使用该周期,以初步序列进行遍历,然后编写了一种中订单输出的方法。
在线OJ
首先找出什么是祖先:
p在5中,Q在8中,与他们相交3、3的地方是公共祖先
limbu清单:
这是5是一个公共节点
在解决问题的问题下:在发布上图之后出现了2种情况:
这可能发生:根是一个P或Q
root.left是空的,或者root.richt是空的
或者不是空的
因为我们可以使用我们使用递归的情况可能会如下。
在线OJ
想法:我们必须首先知道什么是二进制搜索树
当将二进制树变成两条链接列表时,我们需要知道两条路链接列表的域已上前和下一个域
知道这些,让我们看一下如何解决问题
实际上,二进制搜索树可以按顺序排列:例如,上面的树,中阶遍历是有序的。
因此,如何获得两条链接列表;
我们可以看到二进制树实际上位于三个领域
让左侧成为前驱动器,让右继任者
绘制绿色是前驱动器,红色是后驱动器
4的前驱动器是Null 4的后驱动器为6、6是4,而6是继任者8。8仅需要被视为平坦
建议编写面对数字的代码
原始:https://juejin.cn/post/7097946512071589918