L2-006. 树的遍历
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(<=30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:7 2 3 1 5 7 6 4 1 2 3 4 5 6 7输出样例:
4 1 6 3 5 7 2
这个题可以有好几种解法:就本人水平,目前只会通过数组来实现,这个方法比较浪费空间数据大了就不适用。
首先对于二叉树要了解,前序,中序,后序,层序的概念;
1.前序:先根节点,后左子树,最后右子树;
2.中序:先左子树,后根节点,最后右子树;
3.后序:先左子树,后右子树,最后根节点;
4.层序:从上到下一层一层;
使用数组来求需要知道对于二叉树来说:左子树的坐标是2*index+1
对于右子树坐标是2*index+2;
所以使用递归查找更节点,存储在数组中,最后由于有一些数组的值不是题目要求的,所以有个去0的过程。
在递归的过程中最重要的是判断每次左子树与右子树的范围;在这错了好长时间;
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> const int maxn=10000; using namespace std; int s1[maxn],s2[maxn]; int s3[maxn]; void judge(int p1,int p2,int q1,int q2,int index) { if(p1>p2||q1>q2) { return ; } int i; for(i=0;s1[q2]!=s2[p1+i];i++); s3[index]=s1[q2]; //cout<<index<<" "; //最开始就错在这里judge(p1,i-1,qi,q1+i-1,2*index+1)在输出时会出现未知错误。 judge(p1,p1+i-1,q1,q1+i-1,2*index+1); judge(p1+i+1,p2,q1+i,q2-1,2*index+2); } int main() { int n; while(cin>>n) { for(int i=0;i<n;i++) cin>>s1[i]; for(int i=0;i<n;i++) cin>>s2[i]; memset(s3,0,sizeof(s3)); judge(0,n-1,0,n-1,0); int cnt=0; for(int i=0;i<100000;i++) { if(cnt==n)break; if(s3[i]) { cnt++; if(i) { cout<<" "; } cout<<s3[i]; } } } return 0; }