题目:玩转二叉树
思路:递归建树,输出时先右后左入队即可
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
const int maxn = 35;
int before[maxn],maid[maxn],lch[maxn],rch[maxn],n;
int build(int l1,int r1,int l2,int r2){
if(l1 > r1) return 0;
int root = before[l1];
int p = 0;
for(int i=l2;i<=r2;i++){ if(root != maid[i])p++;else break; }
lch[root] = build(l1+1,l1+p,l2,l2+p-1);
rch[root] = build(l1+p+1,r1,l2+p+1,r2);
return root;
}
void bfs(int start){
queue<int>Q;
Q.push(start);
while(!Q.empty()){
int pre = Q.front();Q.pop();
printf("%d",pre);
if(rch[pre]) Q.push(rch[pre]);
if(lch[pre]) Q.push(lch[pre]);
if(!Q.empty()) printf(" ");
}
}
int main()
{
while(cin >> n){
for(int i=0;i<n;i++) scanf("%d",&maid[i]);
for(int i=0;i<n;i++) scanf("%d",&before[i]);
memset(lch,0,sizeof(lch));memset(rch,0,sizeof(rch));
build(0,n-1,0,n-1);
bfs(before[0]);printf("\n");
}
return 0;
}