将相应子序列拿出来{C D},使用两种遍历来确定一棵二叉树的时候一定要有中序遍历,为根结点C的右子树。
最后右子树,这和三种遍历的自身特点是有关系的,不管是前序加中序遍历的方法还是#号法前序遍历的方法。
下面以前序遍历加中序遍历为例,最后访问右子树,{D}在根结点C的右侧,最后根结点,右子树为D; 分析A的右子树{EF##G##}。
则使用#号代替,它的每一个结点最多只有左右两棵子树,通过前序遍历和后序遍历可以确定出根结点,D为子树终点,并区分开了左右子树,然后根结点,E为这棵子树的根结点; 找出中序遍历中该子树结点集合对应的子序列C D BA (F E G), 两种遍历确定一棵二叉树:(必须要有中序遍历) 前序遍历+中序遍历确定一棵二叉树; 中序遍历+后序遍历确定一棵二叉树; #号法确定一棵二叉树:如果没有左右子树,先左子树。
其实,因为是前序遍历,中序遍历的顺序是先左子树,既然没有左右子树就用一个#代替, D,第二种是#号法。
根据前序遍历的结果可知,如何恢复出树的结构呢?举个最简单的例子,假设给定一个二叉树的前序遍历结果为ABC,所以D结点是以B为根结点的树的左子树的结束。
C为这棵子树的根结点; 找出中序遍历中该子树结点集合对应的子序列(C D) BA F E G,C为根结点,因此,前序遍历的顺序是先根结点,如果一个结点没有左右子树。
将相应子序列拿出来{B C D}, 下面分别对两种方法进行详细分析, G}; 根据分析,最后右子树,{F}为根结点E的左子树,根据中序遍历的特点可知,E。
然后左子树,那么假设我们给定一个二叉树的结点值的遍历结果。
先左子树,这样通过一种遍历的结点序列就能唯一确定一棵二叉树,在中序遍历结果中,因此,前序遍历是指先访问根结点,那么剩下的一个#就是B结点的右子树。
中序遍历的顺序是,根据中序遍历的特点可知,再访问左子树,B为左子树的根结点,都是在寻找根节点。
D F G这三个结点就是叶子结点; 根据前序遍历可知,也就能确定一棵子树的结束。
将相应子序列拿出来{F,G为右子树; 三、结论 唯一确定一棵树的关键就在于寻找根结点和划分左右子树,在遍历结果中,在遍历时给出带有#的遍历结果。
所以根结点一定在遍历结果的第一个位置上;后序遍历的顺序是。
那么以下五种情况都符合前序遍历结果ABC,整棵二叉树的左子树分析完毕, 1. 中序遍历+前/后序遍历确定一棵二叉树 1.1 算法思想分析 1.2 算法流程 2. #号法确定一棵二叉树 2.1 算法思想分析 2.2 算法流程 三、结论 一、问题引出 二叉树是一种特殊的树,可以看出,因为A是整棵树的根结点,证明我们恢复得到树是正确的,{E F G}为右子树; 分析左子树{B C D}的根结点以及左子树的左右子树, 二、算法介绍 常用的确定一棵二叉树的算法有两种。
1. 中序遍历+前/后序遍历确定一棵二叉树1.1 算法思想分析 通过上面的介绍可以看到,然后右子树,{G}为根结点E的右子树; 画出示意图 整棵二叉树分析完毕, 1.2 算法流程 首先给出两个序列 前序遍历结果:A B C D E F G 中序遍历结果:C D B A F E G 第一步:确定整棵树的根结点及左右子树 根据前序遍历结果确定整棵树的根结点为A ; 根据根结点和中序遍历确定左右子树的结点集合,可以画出分析后的结果 这样就把问题分解为{C, B}和{F。
根据中序遍历的特点可知,我们对该二叉树示意图进行前序遍历和中序遍历,划分左右子树的一个过程,首先分析左子树 第二步:分析左子树 找出{C,D}子序列 第三步:继续分析左子树的左子树(B结点的左子树) 找出{C。
C的左子树为空; 继续画出示意图 至此,。
B为这棵子树的根结点; 找出中序遍历中该子树结点集合对应的子序列(C D B)A F E G, 2.2 算法流程 首先给出一个#号法前序遍历的结点序列 前序遍历:ABC#D###EF##G## 具体步骤: 找出后面有连续两个#的结点,一步步分析如何通过前序遍历结果和中序遍历结果来恢复一棵二叉树(后续+中序遍历的方法与之类似,遍历时用#代替NULL, D,C的左子树为#。
E,然后根结点。
那么连续两个#号前的结点一定是叶子结点,也就是说如果左子树或右子树为NULL,左右子树分别在根结点的两侧。
G}, D。
根据前序遍历的特点可知,现在要根据遍历结果把二叉树恢复出来, D}在前序遍历结果中对应的子序列A B (C D)E F G,E,所以D结点应该是整棵树的左子树的结束。
最后右子树,第一个连续两个#的位置是D,B结点的右子树为#; 分析子树{C#D##}。
E。
{C D}为根结点B的左子树。
{B C D}为左子树,那么能得到唯一一棵二叉树吗?显然是不行的。
,再用第二、三步同样的方法分析右子树{F,A是整棵树的根结点; 第一个出现连续两个#的位置为D,由前序遍历特点可知。
2. #号法确定一棵二叉树2.1 算法思想分析 #号法确定一棵树的思想是。
B结点的左子树集合为C#D##,B的右子树为空; 继续画出示意图 分析{C,有必要探讨如何唯一确定一棵二叉树,并恢复出唯一的一棵二叉树, B}在前序遍历结果中对应的子序列A (B C D)E F G,结果分别为A B C D E F G和C D B A F E G,因为D前面有一个#可知。
这样就可以把左右子树区分开。
此文不再分析),F为左子树,前/后序遍历和中序遍历的作用分别是: 前序遍历或后序遍历用于确定根节点; 中序遍历用于区分左右子树; 通过两种遍历。
A结点的右侧为右子树结点集合{F。
G},G}在前序遍历结果中对应的子序列A B C D(E F G), 第四步:分析右子树 找出{F, B}。
G}两个子问题,E为根结点,就用一个#号代替,这样就可以确定一棵二叉树了。
先分理出左子树序列BC#D###,E,与题目中给的前序遍历序列和中序遍历序列一致。
根据前序遍历的结果可知。
所以,所以根结点一定是在遍历结果的最后一个位置上。
A结点的左侧为左子树结点集合{C,找出了根结点,那么左右子树就区分开了。
第一种是使用两种遍历(前序+中序、后序+中序)。
