#include <iostream>
#include <algorithm>
#define MAXN 10
using namespace std;
struct node
{
char data;
int lchild;
int rchild;
}T1[MAXN],T2[MAXN];
void BulidT(node T[],int n){
char l1,r1;
for(int i=0;i<n;i++){
getchar();
scanf("%c %c %c",&T[i].data,&l1,&r1);
//先去掉前导\n,再读入字符
if(l1 == '-') T[i].lchild=-1;
else T[i].lchild=(l1-'0');
if(r1 == '-') T[i].rchild=-1;
else T[i].rchild=(r1-'0');
}
}
int check[MAXN];
int FindRoot(node T[],int n){
if(n==0) return -1;
fill(check,check+n,0);
for(int i=0;i<n;i++){
check[T[i].lchild]=1;
check[T[i].rchild]=1;
}
int j;
for(j=0;j<n;j++){
if(!check[j]) break;
}
return j;
}
bool Istonggou(int r1,int r2){
//结点是否存在
if(r1==-1 && r2==-1) return true;
if((r1==-1&&r2!=-1) || (r1!=-1&&r2==-1)) return false;
//结点是否相等
if(T1[r1].data!=T2[r2].data) return false;
/*因为需要判断是否要交换左右子树,所以需要再次判断子结点存在性*/
//子结点是否存在
//不存在
if(T1[r1].lchild==-1 && T2[r2].lchild==-1){
return Istonggou(T1[r1].rchild,T2[r2].rchild);
}
//都存在且相等
if((T1[r1].lchild!=-1 && T2[r2].lchild!=-1) &&
(T1[T1[r1].lchild].data==T2[T2[r2].lchild].data) ){
return Istonggou(T1[r1].lchild,T2[r2].lchild) &&
Istonggou(T1[r1].rchild,T2[r2].rchild);
}else{
//一边不存在或都存在但左右不对应或不同构
return Istonggou(T1[r1].lchild,T2[r2].rchild) &&
Istonggou(T1[r1].rchild,T2[r2].lchild);
}
}
int main(){
int n1,n2;
int root1,root2;
//cin>>n1;
scanf("%d",&n1);
BulidT(T1,n1);
//cin>>n2;
scanf("%d",&n2);
BulidT(T2,n2);
root1=FindRoot(T1,n1);
root2=FindRoot(T2,n2);
if(Istonggou(root1,root2)) cout<<"Yes";
else cout<<"No";
return 0;
}
07-14
742
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交