问题描述
(1)任意给出一种二叉树的遍历结果,是否能重建这个树?
(2)任意给出两种二叉树的遍历结果,是否能重建这个树?
问题解析
问题(1)显然是不可能的,因为无论任意给出哪一种遍历结果我们都无法确定左右子树。
下面分析一下问题(2):
我们知道二叉树通常有3中遍历方式:先序,中序和后序
后序+中序
比如下面这两个序列:
in[] = {4, 8, 2, 5, 1, 6, 3, 7}
post[] = {8, 4, 5, 2, 6, 7, 3, 1}
1) 后序遍历的最后一个节点一定是根节点,所以找到后post[]的最后一个值作为根节点。
2) 找到“1”in[]中的位置,每一个在in[“1”]左侧的值一定分布在左子树上,每一个在in[“1”]右侧的值一定分布在右子树上。
1
/ \
[4,8,2,5] [6,3,7]
3) 递归2)
.b) 递归 in[] = {6,3,7} ;post[] = {6,7,3}
…….使得创建的树作为根节点的右子树.
….a) 递归 in[] = {4,8,2,5}; post[] = {8,4,5,2}.
…….使得创建的树作为根节点的左子树
先序+中序
同后序+中序一样的道理,只不过对于先序来讲,左侧的第一个节点是根节点。
先序+后序
先序+后序的遍历结果不能唯一的确定一棵二叉树
反例:对于只有左子树和只有右子树的二叉树来讲,他们先序和后序的遍历结果是一样的。比方说下面的两棵树先序和后序遍历结果一样,但是却是两颗完全不同的二叉树。
先序:[2,1,3]
后序:[3,1,2]
2 2
/ \
1 1
/ \
3 3