根据前序序列和中序序列构建二叉树
#include<bits/stdc++.h>
using namespace std;
int n;
typedef struct node{
int val;
struct node* left;
struct node* right;
}*Bitree;
/*
如果q1数组为1 2 3 4 5
int* q2=q1+2;
则q2数组为3 4 5
*/
Bitree createBitree(int* q,int* z,int size){//size为中序长度,当size<1时说明该结点为空//
if(size<1)return NULL;
Bitree p=(Bitree)malloc(sizeof(struct node));
p->val=q[0];//每次前序的第一个为结点//
int f=0;//f来计算左子树的结点数//
while(z[f]!=p->val)f++;//计算左子树结点数//
int r=size-f-1;//当前中序长度减去左子树长度再减去根节点为右结点数//
p->left=createBitree(q+1,z,f);//创建左子树,
p->right=createBitree(q+f+1,z+f+1,r);//创建右子树
return p;
}
void hdisplay(Bitree t){
if(t==NULL)return ;
else{
hdisplay(t->left);
hdisplay(t->right);
cout<<t->val<<' ';
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
int q[100];
int z[100];
for(int i=0;i<n;i++){
cin>>q[i];
}
for(int i=0;i<n;i++){
cin>>z[i];
}
int size=n;
Bitree t=createBitree(q,z,size);
hdisplay(t);
return 0;
}