#include<iostream>
using namespace std;
typedef struct node{
int data;
node*left;
node*right;
}*BTnode;
BTnode setTree(int a[],int b[],int sum){//不包括最后一位数
if(sum==0)return NULL;
BTnode BT=new node();
//后续遍历中 根节点在最后一位
BT->data=a[sum-1];
int i;
//在中序遍历中 找到根节点 根节点左右分别是左右子树
for( i=0;i<sum;i++){
if(b[i]==a[sum-1])break;
}
BT->left=setTree(a,b,i);//左子树范围
BT->right=setTree(a+i,b+i+1,sum-i-1);//右子树范围 数组偏移 剩下的长度
return BT;
}
void leveltraversal(BTnode BT,int n){
if(!BT)return;
int lensum=1,sum=0;
//使用两个数组模拟本层和子层
BTnode a[101]={},b[101]={};//指针数组直接初始化 不懂动态分配
a[0]=BT;
while(1){
if(lensum==0)break ;
int pos=0;
for(int i=0;i<lensum;i++){
a[i]->left?b[pos++]=a[i]->left:NULL;
a[i]->right?b[pos++]=a[i]->right:NULL;
if(a[i]){
printf("%d",a[i]->data);sum++;
}
if(sum!=n)printf(" ");
}
lensum=pos;
for(int i=0;i<lensum;i++)a[i]=b[i];
}
}
int main(){
int a[101]={},b[101]={};
int n;
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<n;i++)cin>>b[i];
//建树找根节点
BTnode BT=setTree(a,b,n);
//打印前序遍历
leveltraversal(BT,n);
return 0;
}
建树找根节点的时候
到个根节点,然后根据根节点划分左右