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;
}