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 }
原文地址:https://www.cnblogs.com/ledoc/p/6591900.html