已知二叉树的先序和中序求后序和已知中序和后序求前序
2014-04-15 16:54
190 查看
首先介绍树的三种遍历方式的遍历顺序:
先序遍历:根、左子树、右子树(特点:第一个元素为根)
中序遍历:左子树、根、右子树(特点:根的两边分别为左子树和右子树)
后序遍历:左子树、右子树、根(特点:最后一个元素为根)
有如下图的二叉树:
其先序、中序、后序遍历分别为:DBACEGF、ABCDEGF、ACBFGED。
1、已知先序和中序求后序
先序遍历的第一个字符为根,因此只需在中序遍历中找到它,就可以把根节点的左子树和右子树分开,就可以知道左子树的字符个数和右子树的字符个数,然后可以确定先序遍历中哪部分是左子树,哪部分是右子树,之后递归先序遍历的序列,直到结束。
如上面的例子:先序遍历的第一个字符是D,则根节点为D,从中序遍历中可以找到D的位置,左边的ABC即为左子树的字符,右边的EGF即为右子树的字符,如果开始递归函数为:build("DBACEGF"),则找到根的位置后,可以分为递归左子树的先序遍历和递归右子树的先序遍历:build("BAC")和build("EGF"),其对应的中序遍历为:ABC和EGF。然后继续进行以上步骤,直到找完先序序列。每找到根就可以直接输出或保存到数组中,需要注意的是递归的时候不要把根包含在内。
代码如下:
2、已知中序和后序求先序
后序序列的特点是最后一个是根,道理与已知先序和中序求后序一样,同样是递归,只是需要改变几个参数。附上代码和注释。
先序遍历:根、左子树、右子树(特点:第一个元素为根)
中序遍历:左子树、根、右子树(特点:根的两边分别为左子树和右子树)
后序遍历:左子树、右子树、根(特点:最后一个元素为根)
有如下图的二叉树:
其先序、中序、后序遍历分别为:DBACEGF、ABCDEGF、ACBFGED。
1、已知先序和中序求后序
先序遍历的第一个字符为根,因此只需在中序遍历中找到它,就可以把根节点的左子树和右子树分开,就可以知道左子树的字符个数和右子树的字符个数,然后可以确定先序遍历中哪部分是左子树,哪部分是右子树,之后递归先序遍历的序列,直到结束。
如上面的例子:先序遍历的第一个字符是D,则根节点为D,从中序遍历中可以找到D的位置,左边的ABC即为左子树的字符,右边的EGF即为右子树的字符,如果开始递归函数为:build("DBACEGF"),则找到根的位置后,可以分为递归左子树的先序遍历和递归右子树的先序遍历:build("BAC")和build("EGF"),其对应的中序遍历为:ABC和EGF。然后继续进行以上步骤,直到找完先序序列。每找到根就可以直接输出或保存到数组中,需要注意的是递归的时候不要把根包含在内。
代码如下:
//已知先序和中序求后序 #include<stdio.h> #include <cstring> char a[27],b[27];//存先序遍历和中序遍历 void fun(int ab, int ae, int bb, int be) {//四个参数分别为:先序遍历的起始位置和结束位置和中序遍历的起始位置和结束位置 int i; if(ab>ae)//如果已经到达叶子,返回 return; for(i=bb; b[i]!=a[ab]; ++i);//找到根节点在中序遍历中的位置 fun(ab+1, ae-be+i, bb, i-1);//递归求左子树的后序遍历,ab+1是指把根去掉之后的位置 fun(ae-be+i+1, ae, i+1, be);//递归求右子树的后序遍历 putchar(a[ab]);//在递归结束后输出根 } int main() { int i; while(scanf("%s%s", a, b) != EOF) { int len = strlen(a); fun(0, len-1, 0, len-1); puts(""); } }其中ae-be+i是ae-(be-i),be-i是右子树的长度,ae-(be-i)即是先序遍历中左子树的结束位置,递归右子树同理。
2、已知中序和后序求先序
后序序列的特点是最后一个是根,道理与已知先序和中序求后序一样,同样是递归,只是需要改变几个参数。附上代码和注释。
//已知中序序列和后序序列,求先序序列 #include<stdio.h> #include <cstring> char a[27],b[27]; void fun(int ab, int ae, int bb, int be) { int i; if(ab>ae) return; putchar(a[ae]);//由于是求先序遍历,所以要先输出根节点 for(i=bb; b[i]!=a[ae]; ++i);//对应的,后序序列的最后一个为根,所以根为a[ae] fun(ab, ae-be+i-1, bb, i-1);//递归求左子树的先序遍历 fun(ae-be+i, ae-1, i+1, be);//递归求右子树的先序遍历,ae-1为去掉根后的位置 } int main() { int i; while(scanf("%s%s", a, b) != EOF) { int len = strlen(a); fun(0, len-1, 0, len-1); puts(""); } }在以上程序中,给函数传递了四个参数,分别代表起始和结束位置,其实可以只需要三个参数即可,因为中序遍历的起始位置可以通过另外一个序列的长度来找到,所以只需要ab、ae、be即可。为了方便理解,我传了四个参数。
相关文章推荐
- 已知二叉树的先序遍历和中序遍历,如何求后序遍历
- 已知二叉树的先序排列和中序排列,重构该二叉树,并输出该树的后序遍历
- 已知二叉树的前序,中序,后序遍历中的两个,求另一个
- 已知二叉树的中序序列和前序序列(或后序)求解树
- 已知一棵二叉树的后序遍历和中序遍历,写出可以确定这棵二叉树的算法
- 3.9已知二叉树的 前序遍历和中序遍历的结果,重构出原二叉树
- PAT 1020 已知中序后序,还原二叉树 (二叉树遍历问题)
- 已知二叉树前序遍历和中序遍历的结果,重建二叉树
- 二叉树 已知中序 后序 求前序
- 已知先序+中序构造二叉树,已知后序+中序构造二叉树(C语言)
- noip2003 加分二叉树 (树形dp+分治法,已知中序,输出前序)
- 已知中序,前序,重组二叉树
- 计算机技术——已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?
- 二叉树的重建 已知前序 中序 求后序 递归的方法
- 已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法
- 已知二叉树的中序和前序序列(或后序)求解树
- 二叉树系列(一):已知先序遍历序列和中序遍历序列,求后序遍历序列
- 【树】已知二叉树前序和中序遍历求后序遍历,及中序和后序遍历求前序遍历
- 已知二叉树的前序和中序遍历,构建该二叉树
- LeetCode 106. 已知中序和后序遍历构建二叉树