#include<stdio.h>
#include<stdlib.h>
typedef struct TreeNode BiTreeNode;
typedef BiTreeNode *BiTree;
struct TreeNode{
int Data;
BiTree LeftTree;
BiTree RightTree;
};
typedef struct QNode *Queue;
struct QNode{
int front;
int rear;
BiTreeNode* Q[35];
};
BiTree CreatTreeNode(int Data);
void Solve(int PostOrder[],int InOrder[],int PostLeft,int PostRight,int InLeft,int InRight,BiTree T);
void LevelOrderTraversal(BiTree T);
int IsEmpty(Queue Q);
void AddQ(Queue Q,BiTree T);
BiTree DeleteQ(Queue Q);
int main()
{
int i,N,PostOrder[35],InOrder[35];
scanf("%d",&N);
for(i=0;i<N;i++)
scanf("%d",&PostOrder[i]);
for(i=0;i<N;i++)
scanf("%d",&InOrder[i]);
BiTree T;
T=CreatTreeNode(PostOrder[N-1]);
Solve(PostOrder,InOrder,0,N-1,0,N-1,T);
LevelOrderTraversal(T);
return 0;
}
void Solve(int PostOrder[],int InOrder[],int PostLeft,int PostRight,int InLeft,int InRight,BiTree T)
{
int PostRoot,InRoot,LeftTreeNum,RightTreeNum,i;
if(PostRight<PostLeft)
return;
PostRoot=PostRight;
for(i=InLeft;i<=InRight;i++)
{
if(InOrder[i]==PostOrder[PostRoot])
{
InRoot=i;
break;
}
}
LeftTreeNum=i-InLeft;
RightTreeNum=InRight-i;
if(LeftTreeNum>0)
{
BiTree LeftT;
LeftT=CreatTreeNode(PostOrder[PostLeft+LeftTreeNum-1]);
T->LeftTree =LeftT;
Solve(PostOrder,InOrder,PostLeft,PostLeft+LeftTreeNum-1,InLeft,InRoot-1,LeftT);
}
if(RightTreeNum>0)
{
BiTree RightT;
RightT=CreatTreeNode(PostOrder[PostRight-1]);
T->RightTree =RightT;
Solve(PostOrder,InOrder,PostLeft+LeftTreeNum,PostRight-1,InRoot+1,InRight,RightT);
}
return;
}
BiTree CreatTreeNode(int Data)
{
BiTree T=(BiTree)malloc(sizeof(TreeNode));
T->Data=Data;
T->LeftTree=NULL;
T->RightTree=NULL;
return T;
}
void LevelOrderTraversal(BiTree T)
{
int i=0;
Queue Q=(Queue)malloc(sizeof(struct QNode));
Q->front=Q->rear=-1;
BiTree P;
AddQ(Q,T);
while(!IsEmpty(Q))
{
P=DeleteQ(Q);
if(i==0)
i++;
else
printf(" ");
printf("%d",P->Data);
if(P->LeftTree)
AddQ(Q,P->LeftTree);
if(P->RightTree)
AddQ(Q,P->RightTree);
}
printf("\n");
return ;
}
int IsEmpty(Queue Q)
{
return Q->front==Q->rear;
}
void AddQ(Queue Q,BiTree T)
{
Q->Q[++(Q->rear)]=T;
}
BiTreeNode* DeleteQ(Queue Q)
{
return Q->Q[++(Q->front)];
}