L2-011. 玩转二叉树

L2-011. 玩转二叉树

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(<=30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:
7
1 2 3 4 5 6 7
4 1 3 2 6 5 7
输出样例:
4 6 1 7 5 3 2

分析:这个题目简直就是和l2-006是一个模子刻出来的题目
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct node{
 4     int l, r;
 5 }a[100000];
 6 int frt[32], mid[32];
 7 
 8 int build(int la, int ra, int lb, int rb){
 9     if(la>ra)    return 0;
10     int root=frt[lb];
11     int p1, p2;
12     p1=la;
13     while(mid[p1]!=root)    p1++;
14     p2=p1-la;
15     a[root].l=build(la, p1-1, lb+1,  lb+p2);
16     a[root].r=build(p1+1, ra, lb+p2+1, rb);
17     return root;
18 }
19 void bfs(int x){
20     queue<int>q;
21     q.push(x);
22     int cnt=0;
23     while(q.size()){
24         int m=q.front(); q.pop();
25         ++cnt==1?cout<<m:cout<<" "<<m;
26         if(a[m].r!=0)    q.push(a[m].r);
27         if(a[m].l!=0)    q.push(a[m].l);
28     }
29 }
30 int main(){
31     int n;
32     cin>>n;
33     for(int i=0; i<n; i++)
34         cin>>mid[i];
35     for(int i=0; i<n; i++)
36         cin>>frt[i];
37     int pos=build(0, n-1, 0, n-1);
38     bfs(pos);
39     
40     return 0;
41 }
原文地址:https://www.cnblogs.com/ledoc/p/6591919.html