#include"iostream"
#include"queue"
using namespace std;
int x[1000],z[1000];
struct Tree{
int data;
Tree *left,*right;
};
void xzCreate(Tree* &t,int xl,int zl,int len){ //xl:先序起始下标,zl:中序起始下标,len:数组长度
//cout<<"zl:"<<zl<<ends<<"xl:"<<xl<<ends<<"len:"<<len<<endl;
if(len == 1){
t = new Tree;
t->data = z[zl];
t->left = NULL;
t->right = NULL;
return ;
}
for(int i = 0;z[i + zl] != x[xl];i++); //首先在中序中找到根结点,先序第一个结点就是根结点,所以有z[i + zl] != x[xl]
if(i >= len){ //遍历完数组还没找到根结点,就是输入错误直接返回
return ;
}
//创建根节点
t = new Tree;
t->data = z[i + zl];
t->left = NULL;
t->right = NULL;
int lenl = i; //左子树长度就是i遍历的长度
int lenr = len - lenl - 1; //右子树长度为 : 总长度 - 左子树长度 - 根结点
//中序的左子树起点从最左开始,所以还是它本身
xl = xl + 1; //先序中:左子树起点 = 右子树起点 + 根结点, 跳过根节点即是左子树起点
int zr = lenl + zl + 1; //中序中:右子树起点 = 左子树起点 + 左子树长度 + 根结点
int xr = xl + lenl; //先序中:右子树起点 = 左子树起点 + 左子树长度
//cout<<"lenl:"<<lenl<<ends<<"lenr:"<<lenr<<ends<<"zl:"<<zl<<ends<<"xl:"<<xl<<ends<<"zr:"<<zr<<ends<<"xr:"<<xr<<endl;
//递归建树
if(lenl != 0){
xzCreate(t->left,xl,zl,lenl);
}
if(lenr != 0){
xzCreate(t->right,xr,zr,lenr);
}
}
void show(Tree* &t){
if(t){
cout<<t->data<<ends;
show(t->left);
show(t->right);
}
}
//层次遍历
void sqshow(Tree *t){
queue<Tree*> q;
Tree *p = t;
q.push(p);
while(!q.empty()){
p = q.front();
cout<<p->data<<ends;
if(p->left){
q.push(p->left);
}
if(p->right){
q.push(p->right);
}
q.pop();
}
cout<<endl;
}
int main(){
Tree *t;
int num = 7;
for(int i = 0;i < num;i++){
cin>>x[i];
}
for(i = 0;i < num;i++){
cin>>z[i];
}
xzCreate(t,0,0,num);
sqshow(t);
return 0;
}
/*
1 2 4 5 3 6 7
4 2 5 1 6 3 7
*/