l2-006 树的遍历
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
分析:
这道题和pat l2-004简直就是同一道题目啊...
只不过那题是给你中序和先序...一个意思嘛
在先序或后序中,只要我们知道了左子树或者右子树的范围,我们就可以找到根节点的值,从而在中序中找到根节点的位置,然后递归去做同样的步骤就好啦。层序遍历其实就是bfs啦!用用队列就好了...
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5; 4 int mid[32], bk[32], tree[maxn]; 5 struct node{ 6 int l, r; 7 }a[maxn]; 8 int build(int la, int lb, int ra, int rb){ 9 if(la>lb) return 0; 10 int root=bk[rb]; 11 int p1, p2; 12 p1=la; 13 while(root!=mid[p1]) p1++; 14 p2=p1-la; 15 a[root].l=build(la, p1-1, ra, ra+p2-1); 16 a[root].r=build(p1+1, lb, ra+p2, rb-1); 17 return root; 18 } 19 void bfs(int x){ 20 int cnt=0; 21 queue<int>q; 22 q.push(x); 23 while(q.size()){ 24 int m=q.front(); q.pop(); 25 ++cnt==1? cout<<m:cout<<" "<<m; 26 if(a[m].l!=0) 27 q.push(a[m].l); 28 if(a[m].r!=0) 29 q.push(a[m].r); 30 } 31 } 32 int main(){ 33 int n; 34 cin>>n; 35 for(int i=0; i<n; i++) 36 cin>>bk[i]; 37 for(int i=0; i<n; i++) 38 cin>>mid[i]; 39 int root=build(0, n-1, 0, n-1); 40 bfs(root); 41 42 return 0; 43 }