首先,咱们看看前序、中序、后序遍历的特性: spa
前序遍历:
1.访问根节点
2.前序遍历左子树
3.前序遍历右子树 orm
(我的以为这个命名略微有误导性,由于前序的“前”容易让人误会成树的最前边(视觉上的左边)。记住前序遍历就是最直接(直觉上的)遍历——中左右) 递归
中序遍历:
1.中序遍历左子树
2.访问根节点
3.中序遍历右子树 二叉树
(一样是有误导性的名字。 遍历顺序——左中右) 遍历
后序遍历:
1.后序遍历左子树
2.后序遍历右子树
3.访问根节点 im
(一样是有误导性的名字,“后”字没有任何意义,全部二叉树的遍历,左边必定在右边的以前进行遍历。 遍历顺序——左右中。) 命名
接着,铭记总的方针 img
1. 找到根节点,肯定左子树,肯定右子树 (最重要) di
2. 对左子树进行递归分析 co
3.对右子树进行递归分析
1、已知先序、中序遍历,求后序遍历
例:
先序遍历: GDAFEMHZ
中序遍历: ADEFGHMZ
思路分析:
1. 根据先序遍历的特色——中左右,第一个元素必定是根节点,因此马上肯定G是根节点。
2. 既然肯定了G是根节点,再根据中序遍历的特色——左中右,在根节点G以前的ADEF就是左子树,根节点G以后的HMZ就是右子树。
3.接着分析左子树(思路和第1,2步同样)。把左子树的全部元素(即ADEF这四个元素)在先序遍历和中序遍历中的顺序拿出来进行比较。
先序的顺序是DAFE(中左右),中序遍历是ADEF(左中右)。
经过先序特色得出D是左子树的节点,经过中序特色肯定惟一一个在D左边的A是左子树中的左叶子,右边的是EF。
观察EF的相对位置,在先序(中左右)是FE,在中序(左中右)EF,因此得出EF的关系是左中。
到此得出左子树的形状
4.接着分析右子树(思路和第1,2步同样),把右子树的元素(HMZ)在先序遍历和中序遍历中的顺序拿出来进行比较。
先序的顺序是MHZ(中左右),中序遍历是HMZ(左中右)。
根据先序遍历的特色肯定M是右子树的节点,根据中序遍历的特色肯定H是左叶,Z是右叶。
因此右子树的形状
5.因而得出了整棵树的形状
那么后序遍历就是AEFDHZMG
2、已知中序和后序遍历,求前序遍历
中序遍历: ADEFGHMZ
后序遍历: AEFDHZMG
思路分析:(记住方针是同样的)
1.根据后序遍历的特色(左右中),根节点在结尾,肯定G是根节点。根据中序遍历的特色(左中右),肯定ADEF组成左子树,HMZ组成右子树。
2.分析左子树。ADEF这四个元素在后序遍历(左右中)中的顺序是AEFD,在中序遍历(左中右)中的顺序是ADEF。根据后序遍历(左右中)的特色肯定D是左子树的节点,根据中序遍历(左中右)的特色发现A在D前面,因此A是左子树的左叶子,EF则是左子树的右分枝。
EF在后序(左右中)和中序(左中右)的相对位置是同样的,因此EF关系是左右或者左中,排除左右关系(缺少节点),因此EF关系是左中。
到此得出左子树的形状
3. 分析右子树。HMZ这三个元素在中序遍历(左中右)的顺序是HMZ,在后序遍历(左右中)的顺序是HZM。根据后序遍历(左右中)的特色,M在尾部,即M是右子树的节点。再根据中序遍历(左中右)的特色,肯定H(M的前面)是右子树的左叶子,Z(M的后面)是右子树的右叶子。
因此右子树的形状
4. 最后得出整棵树的形状
那么先序遍历就是GDAFEMHZ .
3、已知前序、后序遍历,求中序遍历
这种状况,可能没法还原出惟一的二叉树,由于没法惟一肯定根节点的左右子树。
(其实还不大清楚具体的证实和缘由,欢迎指教)