二叉树的遍历分为
前序遍历: 根-------左---------右
中序遍历: 左-------根---------右
后序遍历:左--------右---------根
现问题为:已知其两种遍历,然后求第三种遍历
我的思路是先通过前两种遍历还原二叉树,
再求第三种遍历
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.已知前序后序求中序
已知前序后序无法确定具体的左右子树的节点,故无法求解