根据后序和中序遍历序列求二叉树
前文:两道例题让你彻底学会如何根据遍历序列求二叉树
中序:左、根、右
后序:左、右、根
直接上题:
中序:DCBGEAHFIJK
后序:DCEGBFHKJIA
第一步:还是先找到老父亲节点
后序的最后一个节点:A
第二步:划分大哥和二弟的家族
在中序中,老父亲节点左边的为大哥家族,右边的为二弟家族
第三步:完善细节、总结经验
我们先看左边的节点,还是那样,找在两个序列中都挨在一起的几个节点:
1.D、C
2.E、G
3.B、G
1.先看第一个:D和C,D在先序中是第一个访问的,所以他在整个树中是最左边的那个点,他俩在中序和后序中都是同样的顺序:说明他俩一个为父亲,一个为左节点,至于为啥不是同一个父亲的两个孩子,这个想想就知道了,如果他俩有共同的父亲,那么在中序中,访问完左孩子后就应该访问父亲,但是没有。
2.再看E、G:在中序和后序中,这两个的出现顺序是相反的,那么他俩一定是父亲和右孩子,谁是父亲很好判断,在中序中,谁先出来谁是父亲
3.继续看B、G,和2相同,顺序相反,这就可以把B连上去了
我们在来看一下顺序,在中序中的顺序是BGE,后序中是EGB,连接方式就是一条右直线。可以得到结论:如果在中序和后序中多个点是在一起出现的,且顺序相反,那么他们能连成一条右直线
大致的连接方式都画出来了,剩下的就是把他们拼在一起
CD两个点可以确定是在最左边,接下来有两种连法,我们先试一下,再来找规律:
一:B为C的右孩子
二:C为B的左孩子
先看一这种连接方式,满足中序的DCBGE,后序呢?DEGBC和题目不符,舍去
那么只有二了,二的连接方式是完全符合题目的。。
总结一下:如果两个点在中序和后序种同时出现(中间没有任何其他点),那么,作为父亲的节点只有一个孩子
间--------------------隔---------------------------线
左边的完成了,接下来画右边的
同样的方法:找到在两个序列中连着出现的点
1.I、J、K
2.H、F
1很容易,中序中和后序中三个点的出现顺序完全相反:
瞬间画出结果,而且还能确定很重要的一点:J只有K一个孩子
根据中序中,K是最后访问到的,所以K位于该二叉树的最右端,在后序中,I是倒数第二个访问的,所以I的老父亲A的右孩子
2.HF在两个序列中出现顺序相反:
也是直接画出结果
接下来就是把这两个连起来
之前得到的结论,J只有K一个孩子,而K是整个树中最右边的节点,所以只能这么连:
这样一个二叉树就画完了,最后在根据二叉树写一下他的中序和后序序列验证一下结果。我比较有自尊,坚信自己是对的,就不验证了。