二叉树已知两种遍历结果求另一个遍历结果

二叉树的遍历分为
前序遍历: 根-------左---------右
中序遍历: 左-------根---------右
后序遍历:左--------右---------根
现问题为:已知其两种遍历,然后求第三种遍历

我的思路是先通过前两种遍历还原二叉树,
再求第三种遍历

1.已知前序中序,求后序遍历

简单的例子:

已知
先序遍历为ABCDEF
中序遍历为CBAEDF
求后序遍历。

解:根据先序遍历的公式 【(根)(左子树)(右子树)】
则可以得出根节点为A
根据中序遍历的公式【(左子树)(根)(右子树)】
则可以得出CB为左树,EDF为右树

 现在从左树开始递归,从先序遍历中摘出左树先序BC,从中序遍历中摘出左树CB

重复第一步,
已知先序遍历BC
中序遍历CB
根据先序遍历的公式 【(根)(左子树)(右子树)】
则可以得出根节点为B
根据中序遍历的公式【(左子树)(根)(右子树)】
则可以得出C为左树

现在从右树开始递归
重复第一步,
已知先序遍历DEF
中序遍历EDF
根据先序遍历的公式 【(根)(左子树)(右子树)】
则可以得出根节点为D
根据中序遍历的公式【(左子树)(根)(右子树)】
则可以得出E为左树 ,F为右子树

    则可以还原二叉树

请添加图片描述

所以,根据后序遍历的公式【(左子树)(右子树)(根)】
则可以得A为最后一位,可得【(BC)(DEF)(A)】
再进入左子树(只有BC节点),进行上述操作,则左子树的后序为【(C)(空)(B)】,,即CB
同理,右子树(只有DEF节点)的后序为【(E)(F)(D)】,
此时已经没有更多的子树了,所以答案为上述的拼接即【(CB)(EFD)(A)】
所以为后序遍历为CBEFDA

稍微复杂的例子

已知先序遍历为
A,B,D,H,E,I,C,F,J,K,G
中序遍历为
D,H,B,E,I,A,J,F,K,C,G
求后序遍历。

解:
通过先序的特点(根------左-------右)则A为树的根节点
中序遍历的特点(左-------根------右)可以得出,
DHBEI为左树,JFKCG为右树

这里进入左树递归,
摘出左树的先序
BDHEI
中序
DHBEI
同上则B为根节点,(DH)为左树,(EI)为右树
再进入左树(DH)递归
先序DH
中序DH
同理可得,D为根节点,H为右键点
再进入右树(EI)递归
先序EI
中序EI
同理可得,根节点为E,右节点为I
则可以得出完整的左树
在这里插入图片描述
再进入右树进行递归,
摘出右树的先序
CFJKG
右树的中序
JFKCG

因为先序的特点(根------左------右)
中序的特点(左-----右------根)
可知C为根节点,(JFK为左树)(G为右树)
再递归进入左树(只有J,F,K节点)
摘出其先序为FJK
中序为JFK
同上可知F为根节点,J为左,K为右
可还原出完整右树

请添加图片描述
将完整的左树和右树拼接可还原树的结构为
请添加图片描述

再根据后序遍历的特点即可知【(左(有节点DBHEI))(右(有节点CFJKG))(A)】
进入完整左树递归可得【(左(有节点DH))(右(有节点EI))(B)】
再进入左树(只有DH节点)可得【(无)(H)(D)】,
再进入右树(只有EI节点)可得【(无)(I)(E)】,
所以完整的左树拼接为【(HD)(IE)(B)】
进入完整的右树递归可得【(左(有节点FJK))(右(只有G节点))(C)】
再进入树(只有FJK节点)可得【(J)(K)(F)】
拼接则为【(J)(K)(F)(G)(C)】
完整拼接,整棵树的后序遍历结果即为
HDIEBJKFGCA

2.已知后序中序,求前序遍历

例:已知
中序:DGBAECFH
后序:GDBEHFCA

解:已知后序遍历的公式为(左------右------根),所以A为树的根节点
已知中序遍历的公式为(左------根------右),所以(DGB)为左子树,(ECFH)为右子树

   递归左子树
   中序DGB
   后序GDB
   同上理,则B为根节点,(GD)为左子树,右子树为空
   再次递归左子树GD
   中序DG
   后序GD
   同理得D为根节点,G为右节点,
   所以还原完整左树如下

请添加图片描述

递归右子树
中序:ECFH
后序:EHFC
根据后序的特点得C为根节点,根据中序的特点(E)为左子树,(FH)为右子树。
进入右子树,
中序:FH
后序:HF
据上理可得F为根节点,H为右节点
故可以还原完整右子树
请添加图片描述
将两棵树拼接为
请添加图片描述
根据前序遍历的特点先将其分为【(A)(BDG)(CEFH)】
递归左子树(BDG)
可得【(B)(DG)()】的树
递归DG,则可得【(D)()(G)】
所以左树的前序为BDG
递归右子树(CEFH)
可得【(C)(E)(FH)】
递归FH,可得【(F)()(H)】
则完整的右子树为CEFH
前序遍历就为
ABDGCEFH

3.已知前序后序求中序

已知前序后序无法确定具体的左右子树的节点,故无法求解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗马苏丹默罕默德

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值