释放无限光明的是人心,制造无边黑暗的也是人心,光明和黑暗交织着,厮杀着,这就是我们为之眷恋又万般无奈的人世间。
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#include<climits>//INT_MAX
//#include<bits/stdc++.h>
#define PP pair<ll,int>
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3fll
#define dinf 1000000000000.0
#define PI 3.1415926
typedef long long ll;
using namespace std;
int const mod=1e9+7;
const int maxn=1e4+10;
int N,zx[40],qx[40];
typedef struct node{
int data;
node *l,*r;
}kj,*tree;
void jtree(tree &t,int ks,int js,int cd){
int ls;
if(cd<=0){
t=NULL;
return ;
}
else{
t=(tree)malloc(sizeof(kj));
t->data=qx[ks];
for(int i=0;i<N;i++){
if(zx[i]==qx[ks]){
ls=i;
break;
}
}
int cdf=ls-js;
jtree(t->l,ks+1,js,cdf);
int cdr=cd-1-cdf;
jtree(t->r,ks+cdf+1,ls+1,cdr);
}
return ;
}
void fz(tree &t){
if(t==NULL){
return;
}
if(t->l!=NULL&&t->r!=NULL){
tree temp;
temp=t->l;
t->l=t->r;
t->r=temp;
}
else if(t->l==NULL&&t->r!=NULL){
t->l=t->r;
t->r=NULL;
}
else if(t->l!=NULL&&t->r==NULL){
t->r=t->l;
t->l=NULL;
}
fz(t->l);
fz(t->r);
return;
}
void cx(tree t){
queue<tree> q;
if(t!=NULL)
q.push(t);
while(!q.empty()){
tree temp=q.front();
cout<<temp->data;
q.pop();
if(temp->l!=NULL)
q.push(temp->l);
if(temp->r!=NULL)
q.push(temp->r);
if(!q.empty())
cout<<' ';
}
}
int main(){
tree t;
cin>>N;
for(int i=0;i<N;i++)
cin>>zx[i];
for(int i=0;i<N;i++)
cin>>qx[i];
jtree(t,0,0,N);//建树
fz(t);//翻转
cx(t);//层序遍历输出
cout<<endl;
return 0;
}