两道例题让你彻底学会如何根据遍历序列求二叉树

两道例题让你彻底学会如何根据遍历序列求二叉树(上)

先序:根、左、右
中序:左、根、右
后序:左、右、根

话不多说,直接上题:
先序:ABCDEFGHIJKL
中序:CBEFDGAJIKLH

第一步:找到根节点
很容易:先序序列的第一个访问的就是根节点,后序序列访问的最后一个是根节点,
很容易的找到该题老父亲根节点为A

第二步:根据根节点确定左右子树,也就是根节点的两个孩子及其后代。
我们首先确定一件事,题目要你根据序列求二叉树,一定是给你了中序序列,如果不给,则无法确定二叉树。
根据中序序列,我们确定根节点左边的都是左边的后代,也就是大哥及其后代们:CBEFDG
根节点右边的是二弟及其后代们:JIKLH
我们根据第二步可以确定这棵树为下图所示的样子
在这里插入图片描述

可以清楚的看到,我们经过这两步简单的划分,把这些节点大致分了类

第三步:填补细节
我提供我的方法:找到在两个序列中都连续的节点,建议三个一组或四个一组的找。
先序中的DEF和中序中的EFD。

注意:我这里说的连续并不是指ABCD这种连续,而是在两个序列中一起出现的那种连续

如果你这时候说CBEFDGBCDEFG不也是连续的吗。那我只能说:你开心就好,但路要一步一步走,饭要一口一口吃,步子迈大了,容易扯着蛋,饭一口吃多了,容易卡喉咙
回到正题,我们要做的就是先拆散,再集合。选择的个数越少越容易。
我们先看先序的EF和中序的EF这个显而易见的相同的顺序,根据先序的根左右和中序的左根右,判断出来E是F的爹,F是E的右孩子而且E也只有他一个孩子,也就是这个样子
在这里插入图片描述
再确定D的位置,由于在先序中,D在E的前面,所以D肯定是E的父亲,至于E是D的左孩子还是右孩子,试一下就知道了

我们首先看这种情况:E为D的右孩子
在这里插入图片描述
此时我们得到的先序序列是:DEF,中序:DEF,是不是和题目不一样啊,所以这个画法是错误的,但是这个错误的画法给我们提供的一个模板,那就是如果中序和先序序列一样,那么这些点就是按上图所示的连接起来的,全是右孩子

第二种情况,E为D的左孩子
在这里插入图片描述
这时得到的先序:DEF,中序:DFE和题目相符。所以,D、E、F的连接方式应该是上图所示。

其实我们也可以先画出左边的连接方式,根据中序,确定最左边的那个孩子为C,再根据先序根A到C之间的所有节点都能连成一条直线:根据先序的根左、根左顺序,一直画到底,也就是这样:
在这里插入图片描述
这个是最容易画的,也应该是最先做的,画起来是最爽的。

我们现在只有G和D的位置不确定了。再根据先序,遍历完C之后的第一个就是D,那么D一定是B的右孩子了,那么D就很容易的接上去:
在这里插入图片描述
那么G的位置在哪我就不用多说了吧?

在这里插入图片描述
此时我们再来看一下之前得到的一个结论:如果中序和先序序列一样,那么这些点就是按上图所示的连接起来的,全是右孩子,看看BDG在先序和中序中的顺序,是不是B永远在D的前面,D永远在G的前面啊,他们连成了一条线,其实这东西我也说不清楚,你们自己多做几道题就能看明白了,我只是给你们提供一些方法,

我们再来画右边的图,先序遍历完左边的节点后,往右边遍历的第一个节点就是H,那么H一定是A的右孩子
在这里插入图片描述

利用上面提到的结论:KL在两个序列中的都是连在一起而且顺序也都是一样的,那么他们一定是这样的关系
在这里插入图片描述
I、J在两个序列中连在一起,但是顺序相反,那么他们一定是这样的

在这里插入图片描述

这下总根右边的节点都大致连了一遍,剩下就很简单了。
先序中H之后的节点是I,那么I是H的左孩子,或者右孩子(只有右孩子)
而在中序中,H是最后访问的,那么I只能是H的左孩子,而且H只有左孩子
在这里插入图片描述
那么现在只剩K的连接位置了,K要么是I的右孩子,要么是J的左孩子或者右孩子。

最简单是方法:试一下就知道了

我懒得试,直接用上面的方法:在中序和先序中,I、K、L的先后顺序是不变的,那么说明了什么问题?
他三在同一直线上啊!!!

在这里插入图片描述
写了这么多我也不知道你们看懂没,没看懂的就照着画一下,多画几下就明白了。我写的很迷,整体过程也有些问题,但是我懒得改了,大致上还是能解决问题了

好了,就写到这里吧。什么?你问我不是两道例题吗?是啊,但是我不知道一个题就写了我这么久,太费时间了,以后有时间再写后序和中序的。

  • 14
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值