团体程序设计天梯赛-练习集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
思路:这道题和玩转二叉树是同一类型的题,代码不同的主要是递归位置
结合给出的两个遍历构建二叉树,然后输出所求的
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define maxn 1000
 4 int be[maxn],mid[maxn];
 5 struct Node
 6 {
 7     int l;
 8     int r;
 9 } aa[maxn];
10 //先从后序遍历中找到根节点,再到中序遍历找到它出现的位置,然后递归下去 
11 int build(int la,int ra,int lb,int rb)
12 {
13     if(la>ra)
14         return 0;//防止出界 
15     int root,p1,p2;
16     root=be[rb];
17     p1=la;
18     while(mid[p1]!=root) p1++;
19     p2=p1-la;
20     aa[root].l=build(la,p1-1,lb,lb+p2-1);//递归思想 
21     aa[root].r=build(p1+1,ra,lb+p2,rb-1);
22     return root;
23 }
24 void bfs(int x) //层次遍历
25 {
26     queue<int> q;
27     vector<int> v;
28     q.push(x);
29     while(!q.empty())
30     {
31         int w=q.front();
32         q.pop();
33         if(w==0)
34             break;
35         v.push_back(w);
36         if(aa[w].l!=0) q.push(aa[w].l);
37         if(aa[w].r!=0) q.push(aa[w].r);
38     }
39     int len=v.size();
40     for(int i=0; i<len; i++)
41         printf("%d%c",v[i],i==len-1?'\n':' ');
42     return ;
43 }
44 int main()
45 {
46     int n;
47     scanf("%d",&n);
48     for(int i=0; i<n; i++) scanf("%d",&be[i]);
49     for(int i=0; i<n; i++) scanf("%d",&mid[i]);
50     build(0,n-1,0,n-1);
51     int root=be[n-1];
52     bfs(root);
53     return 0;
54 }

 

posted @ 2016-07-11 09:08  April_AA  阅读(907)  评论(0编辑  收藏  举报