#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
int in[300];//中序遍历数组
int f[300];//前序遍历
int cnt;
struct node
{
int data;
node *l,*r;
node(){
l=NULL;
r=NULL;
}
};
vector<node *>v;
node *create(node *root,int first,int end)
{
root=new node();
root->data=f[cnt++];
int i;
for(i=first;i<=end;i++)
{
if(in[i]==root->data){
break;
}
}
if(i>first){
root->l=create(root->l,first,i-1);
}
if(i<end){
root->r=create(root->r,i+1,end);
}
return root;
}
void regulate(node *root)
{
if(root!=NULL&&(root->r!=NULL||root->l!=NULL))
{
v.push_back(root);
regulate(root->l);
regulate(root->r);
}else{
return ;
}
}
void sequence(node *root)//层次遍历
{
int num=0;
if(!root){
return ;
}
queue<node *>v;
v.push(root);
num++;
node *tmp;
while(!v.empty())
{
tmp=v.front();
v.pop();
if(num>1){
printf(" ");
}
printf("%d",tmp->data);
if(tmp->l){
v.push(tmp->l);
}
if(tmp->r){
v.push(tmp->r);
}
num++;
}
}
int main()
{
int n;
scanf("%d",&n);
int i;
for(i=0;i<n;i++)
{
scanf("%d",&in[i]);
}
for(i=0;i<n;i++)
{
scanf("%d",&f[i]);
}
cnt=0;
node *root=create(root,0,n-1);
regulate(root);
vector<node *>::reverse_iterator it=v.rbegin();
while(it!=v.rend())
{
if((*it)->l==NULL&&(*it)->r!=NULL){
(*it)->l=(*it)->r;
(*it)->r=NULL;
}else if((*it)->l!=NULL&&(*it)->r==NULL){
(*it)->r=(*it)->l;
(*it)->l=NULL;
}else{
node *tt;
tt=(*it)->r;
(*it)->r=(*it)->l;
(*it)->l=tt;
}
it++;
}
sequence(root);
return 0;
}
L2-011 玩转二叉树
最新推荐文章于 2024-04-18 14:56:15 发布