当前位置: 首页 > 网络应用技术

【java】二进制树的基本分析

时间:2023-03-07 14:17:47 网络应用技术

  如果您想学习二进制树,则需要知道什么是树

  树是非线性数据结构。它是由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