根据树遍历序列求解树结构

来源:互联网 发布:数据标准该怎么制定 编辑:程序博客网 时间:2024/06/16 15:03

华电北风吹
日期:2015/9/8

本文从二叉树的三种遍历方式中选择两种遍历方式,讨论怎么还原出二叉树的完整结构。

树遍历基础知识:
1) 前序遍历:根节点+左子树+右子树
2) 中序遍历:左子树+根节点+右子树
3) 后序遍历:左子树+右子树+根节点

一、已知前序遍历和中序遍历
已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF
(http://www.nowcoder.com/questionTerminal/d06c0640861a4523a6edec11512200bd)
解题思路:回看一下式1和式2。可以看出前序遍历的第一个元素就是这个子树的根节点,然后就可以结合中序遍历划分左右子树,进而对左右子树的前序遍历和中序遍历递归求解子树树根,直至子树为空。
例题解释:有前序序列可以知道根节点为A,由中序序列可以知道A的左子树中序遍历为DBGE,由前序序列可以知道A的左子树前序序列为BDEG。接下来可以得到A右子树前序序列为CFH,中序遍历为CHF。接下来递归求解即可。
这里写图片描述
二、已知后序遍历和中序遍历
已知某二叉树的后序遍历序列是dabec,中序遍历序列是debac http://www.nowcoder.com/questionTerminal/bfca1ca6a3924132b514e1c56dbfa77e
解题思路:回看一下式2和式3。后序遍历的根节点在最后一个元素,因此可以根据根节点结合中序遍历,将找出根节点的左子树、右子树。进而递归需找子树根节点,直至子树为空。
例题解释:根据后序遍历可知根节点为c,结合中序遍历c左子树中序遍历为deba,前序遍历为dabe,右子树为空。接下来对左子树递归求解即可。
这里写图片描述
三、已知前序遍历和后序遍历
这种方式是无法确切还原出树的结构的。
回看一下式2和式3。两种遍历方式都可以获得根节点,但是没有任何信息可以直接对(左子树+右子树)构成的序列进行左右子树划分。可以利用的信息是子树的前序遍历第一个节点是后序遍历的最后一个节点,这样能够找到子树,但是当某个节点只有一个子树的时候,无法判断是左子树还是右子树。
以第一个例子为例解释:
二叉树前序遍历为ABDEGCFH,后序序列为DGEBHFCA
可以确定第一个根节点是A,A第一个子树根节点是B,根节点为B的子树后序遍历为DGEB,前序遍历为BDEG,A第二个子树根节点为C,他的后序遍历为HFC,前序遍历为CFH,然后一次递归。简单起见,我们只看A第二个子树,即右子树C。C的第一个根节点F,子树F的后序遍历HF,前序遍历FH,C没有第二个子树,这时不管F为左子树还是右子树都是满足要求的。同理F的子树H。
这里写图片描述
图中只有一个子树的用两条线连接,表示这是左右子树均可。

总结,在由两种遍历方式求树结构的时候,关键是先找到根节点,然后对左右子树递归求解。

0 0
原创粉丝点击