二叉树遍历 ,根据先序和中序遍历序列建树

先序可以判断根

中序可以判断左右孩子

后序可以判断根

例题1.已知二叉树的先序、中序和后序序列分别如下,但其中有一些已模糊不清,试构造出该二叉树。
先序序列 _BC_EF__
中序序列 BDE_AG_H
后序序列 _DC_GH_A
解法:
后序最后一个是A,所以A是先序的第一个得到:
先序序列 ABC_EF__ 
中序序列 BDE_AG_H 
后序序列 _DC_GH_A 
_____________(A)____________
____________/___\___________
________(BDE_)_(G_H)________


先序的第二个元素是B,所以B是A的左子树根节点
由中序B在最前,知道其他元素都在B的右子树上
所以,后序序列为(DE_)B(G_H)A,对比已有的后序序列_DC_GH_A 
得后序序列为:EDCBGHFA,中序序列为:BDECAGFH 
先序序列 ABC_EF__ 
中序序列 BDECAGFH 
后序序列 EDCBGHFA
所以,二叉树为:
_____________(A)_____________
____________/___\____________
__________(B)____(F)_________
___________\_____/_\_________
___________(C)_(G)_(H)_______
___________/_________________
_________(D)_________________
__________\__________________
__________(E)________________
例题2;           1
               2  3
              4 5 6 7
当你拿到一棵二叉树,无论它的形状如何的千奇百怪
我们都可以将它按照如下的方式划分
       根
    /      \
左子树    右子树
一棵有很多个节点的二叉树可以划分为以上的形式
也可以这么理解,只要是按以上形式组合的都可以称为是二叉树
一个仅仅只有根节点的二叉树也可以划分成以上的形式,只不过他的左右子树都为空罢了
所以,我们发现,二叉树的定义其实是一个递归定义的过程
大的二叉树是由小的二叉树构建而成的
所以,当我们考虑要遍历一棵二叉树时
也是首选递归的遍历
遍历二叉树
它的基本思想是先按照上面的形式把整棵二叉树划分为3部分
哪么接下来的工作就很简单了
我们只需要将这3部分都遍历一遍就可以了(这里用到了分而治之的思想)
而对于这3部分来说
根节点的遍历无疑是最方便的,直接访问就ok了
而对于左右子树呢?
我们不难发现,左右子树其实分别成为了两棵完整的树
他们拥有各自独立的根节点,左子树和右子树
对他们的遍历,很显然应该与刚才的遍历方法一致便可
(如果上面的都理解了,那么这个题就是小菜一碟了,如果觉得无法理解,可以按照下面的方法自己多分解几棵树)
对于这个题目,中序遍历这可二叉树
先看根节点
         1
     /        \
左子树      右子树
我们应该先遍历左子树
也就是下面这棵树
    2
  /   \
4       5
对于这棵树在进行中序遍历
我们应先遍历她的左子树
他只有一个根节点4,左右子树都为空
哪么遍历这个只有一个根节点的二叉树
先访问她的左子树,为空
返回
访问该树的根节点4
在访问右子树也为空
此时,这棵树已经被完全的遍历了
我们需要返回上一层也就是
    2
  /   \
4       5
这棵树
此时,她的左子树已经被访问完毕
根据中序遍历的规则
需要访问此树的根节点2
此时的访问顺序是4-2
访问了根节点
在访问右子树只有一个根节点的5(具体过程看4的访问)
5访问完毕
也就意味着
    2
  /   \
4       5
这棵树已经访问完了
需要返回上一层
也就是1为根的树
此时这棵树的左子树已经访问完毕
此时访问的顺序是4-2-5应该没有问题
接下来访问根节点1
在访问右子树
   3
  /   \
4       7
是不是觉得似曾相识???
她的访问应该跟
   2
  /   \
4       5
一致
哪么最终遍历的顺序也出来了
4-2-5-1-6-3-7

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值