1 #include <iostream> 2 using namespace std; 3 4 struct Tree 5 { 6 int data; 7 Tree *lchild; 8 Tree *rchild; 9 }tree; 10 11 Tree *Create(int a1[],int b1[],int n) 12 { 13 int k; 14 if(n<=0) 15 return NULL; 16 int root=a1[0]; 17 Tree *bt=(Tree *)malloc(sizeof(Tree)); 18 bt->data=root; 19 for(k=0;k<n;k++) 20 { 21 if(b1[k]==root) 22 break;//分割左右子树 23 } 24 bt->lchild=Create(a1+1,b1,k); 25 bt->rchild=Create(a1+k+1,b1+k+1,n-k-1); 26 return bt; 27 } 28 29 int same(Tree *x1,Tree *x2) 30 { 31 if(x1->data!=x2->data) 32 return -1; 33 if(x1->data==x2->data) 34 { 35 if((x1->lchild==NULL&&x2->lchild==NULL)&&(x1->rchild!=NULL&&x2->rchild!=NULL)) 36 return same(x1->rchild,x2->rchild); 37 if((x1->lchild!=NULL&&x2->lchild!=NULL)&&(x1->rchild==NULL&&x2->rchild==NULL)) 38 return same(x1->lchild,x2->lchild); 39 if((x1->rchild!=NULL&&x2->rchild==NULL)||(x1->rchild==NULL&&x2->rchild!=NULL)||(x1->lchild!=NULL&&x2->lchild==NULL)||(x1->lchild==NULL&&x2->lchild!=NULL)) 40 return -1; 41 if((x1->lchild==NULL&&x2->lchild==NULL)&&(x1->rchild==NULL&&x2->rchild==NULL)) 42 return 1; 43 if((x1->lchild!=NULL&&x2->lchild!=NULL)&&(x1->rchild!=NULL&&x2->rchild!=NULL)) 44 return (same(x1->rchild,x2->rchild)==1&&same(x1->lchild,x2->lchild)==1); 45 } 46 return 1; 47 } 48 49 int main() 50 { 51 Tree *rt1,*rt2; 52 int is; 53 int a1[107],b1[107],a2[107],b2[107],N;//N为总节点数,a为先序序列,b为中序序列 54 cin>>N; 55 for(int i=0;i<N;i++) 56 cin>>a1[i]; 57 for(int i=0;i<N;i++) 58 cin>>b1[i]; 59 for(int i=0;i<N;i++) 60 cin>>a2[i]; 61 for(int i=0;i<N;i++) 62 cin>>b2[i]; 63 rt1=Create(a1,b1,N);//存树 64 rt2=Create(a2,b2,N); 65 is=same(rt1,rt2); 66 if(is==1) 67 cout<<"YES"<<endl; 68 else 69 cout<<"NO"<<endl; 70 return 0; 71 }