#include <stdio.h>
#include <string.h>
#include <map>
#include <set>
#include <queue>
#include <string>
#include <algorithm>
using namespace std;
int N,post[40],in[40];
struct node
{
int data;
node* lchild;
node* rchild;
};
node* newnode(int x)
{
node* root=new node;
root->data=x;
root->lchild=NULL;
root->rchild=NULL;
return root;
}
node* create(int pl,int pr,int il,int ir)
{
if(pl>pr)return NULL;
node* root=newnode(post[pr]);
int k=-1;
for(int i=il;i<=ir;i++)
{
if(post[pr]==in[i])
{
k=i;
break;
}
}
int numl=k-il;
root->lchild=create(pl,pl+numl-1,il,k-1);
root->rchild=create(pl+numl,pr-1,k+1,ir);
return root;
}
vector<int> h[40];
int levelorder(node* root)
{
queue<node*> q;
q.push(root);
node* preend=root;
node* last=root;
int level=0;
int num=0;
while(!q.empty())
{
node* top=q.front();
q.pop();
h[level].push_back(top->data);
if(top->lchild!=NULL)
{
q.push(top->lchild);
last=top->lchild;
}
if(top->rchild!=NULL)
{
q.push(top->rchild);
last=top->rchild;
}
if(preend==top)
{
level++;
preend=last;
}
}
return level;
}
int main()
{
scanf("%d",&N);
for(int i=0;i<N;i++)
{
scanf("%d",&in[i]);
}
for(int i=0;i<N;i++)
{
scanf("%d",&post[i]);
}
node* root=create(0,N-1,0,N-1);
int l=levelorder(root);
bool flag=false;
int num=0;
for(int i=0;i<l;i++)
{
if(!flag)
{
for(int j=h[i].size()-1;j>=0;j--)
{
if(num!=0)printf(" ");
printf("%d",h[i][j]);
num++;
}
flag=true;
}
else
{
for(int j=0;j<h[i].size();j++)
{
if(num!=0)printf(" ");
printf("%d",h[i][j]);
num++;
}
flag=false;
}
}
return 0;
}
PAT甲1127 ZigZagging on a Tree(30 分)
最新推荐文章于 2021-03-09 11:40:09 发布