
题目地址 : https://www.patest.cn/contests/gplt/L2-011
和之前那题很像,不明白为什么这么少人做。。。
>>>**********************************************************************>>>
#include <stdio.h>
#include < string.h>
#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <queue>
#define maxn 32
using namespace std;
typedef struct{
int l;
int r;
}node;
int mid[maxn], fora[maxn], n, root, ex;
node ans[maxn];
void level( int rt){
int cnt = 0, temp;
queue < int> q;
q.push(rt);
while(!q.empty()){
temp = q.front();
q.pop();
cout << fora[temp];
cnt ++;
if(cnt < n)
cout << " ";
else if(cnt == n)
cout << endl;
if(ans[temp].l != - 1)
q.push(ans[temp].l);
if(ans[temp].r != - 1)
q.push(ans[temp].r);
}
return;
}
int build( int a, int b, int c, int d){
if(a > b)
return - 1;
int rt = c;
int point = a;
while(mid[point] != fora[rt])
point++;
int dis = point-a ;
ans[rt].l = build(a, point- 1, c+ 1, c+dis);
ans[rt].r = build(point+ 1, b, c+dis+ 1, d);
return c;
}
void trans( int rt){
if(rt < 0 || rt >= n){
return ;
}
if(ans[rt].l == - 1 && ans[rt].r == - 1){
return ;
}
ex = ans[rt].l;
ans[rt].l = ans[rt].r;
ans[rt].r = ex;
trans(ans[rt].l);
trans(ans[rt].r);
}
int main(){
// freopen("in.txt", "r", stdin);
scanf( " %d ", &n);
for( int i= 0; i<n; ++i)
scanf( " %d ", &mid[i]);
for( int i= 0; i<n; ++i)
scanf( " %d ", &fora[i]);
memset(ans, - 1, sizeof(ans));
root = build( 0, n- 1, 0, n- 1);
trans(root);
level(root);
return 0;
}
#include < string.h>
#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <queue>
#define maxn 32
using namespace std;
typedef struct{
int l;
int r;
}node;
int mid[maxn], fora[maxn], n, root, ex;
node ans[maxn];
void level( int rt){
int cnt = 0, temp;
queue < int> q;
q.push(rt);
while(!q.empty()){
temp = q.front();
q.pop();
cout << fora[temp];
cnt ++;
if(cnt < n)
cout << " ";
else if(cnt == n)
cout << endl;
if(ans[temp].l != - 1)
q.push(ans[temp].l);
if(ans[temp].r != - 1)
q.push(ans[temp].r);
}
return;
}
int build( int a, int b, int c, int d){
if(a > b)
return - 1;
int rt = c;
int point = a;
while(mid[point] != fora[rt])
point++;
int dis = point-a ;
ans[rt].l = build(a, point- 1, c+ 1, c+dis);
ans[rt].r = build(point+ 1, b, c+dis+ 1, d);
return c;
}
void trans( int rt){
if(rt < 0 || rt >= n){
return ;
}
if(ans[rt].l == - 1 && ans[rt].r == - 1){
return ;
}
ex = ans[rt].l;
ans[rt].l = ans[rt].r;
ans[rt].r = ex;
trans(ans[rt].l);
trans(ans[rt].r);
}
int main(){
// freopen("in.txt", "r", stdin);
scanf( " %d ", &n);
for( int i= 0; i<n; ++i)
scanf( " %d ", &mid[i]);
for( int i= 0; i<n; ++i)
scanf( " %d ", &fora[i]);
memset(ans, - 1, sizeof(ans));
root = build( 0, n- 1, 0, n- 1);
trans(root);
level(root);
return 0;
}
>>>好不容易水过31 题来到第一页,明天就要去比赛了.>>>
>>>强行装逼

