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 }