给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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
- 比较水的一道题
却写了半天。第一次提交最后一个样例点段错误,原因是空间开小了。
#include<stdio.h> #include<string.h> int tree[1000*4+10]; void build(int l1,int r1,int l2,int r2,int pos[],int ino[],int root)///建树,基本操作 { if(l1>r1) return; tree[root]=pos[r1]; for(int i=0; l2+i<=r2; i++) { if(pos[r1]==ino[l2+i]) { build(l1,l1+i-1,l2,l2+i-1,pos,ino,root*2); build(l1+i,r1-1,l2+i+1,r2,pos,ino,root*2+1); break; } } } int main() { int n; int ino[50],pos[50]; memset(tree,0,sizeof(tree)); scanf("%d",&n); for(int i=1; i<=n; i++) scanf("%d",&pos[i]); for(int i=1; i<=n; i++) scanf("%d",&ino[i]); build(1,n,1,n,pos,ino,1); int cnt=0; for(int i=1;;i++)////层次遍历 { if(tree[i]!=0) { cnt++; if(cnt==1) printf("%d",tree[i]); else printf(" %d",tree[i]); if(cnt==n) break; } } return 0; }