树的同构虽然很简单但写了半天,麻了
#include <stdio.h>
struct Tree
{
char a;
int left,right;
}T1[99],T2[99];
int BT(int N,struct Tree T[])
{int i,out;
char c,cl,cr;
int Check[N];
out=0;
for(i=0;i<N;i++)
{
Check[i]=0;
}
for(i=0;i<N;i++)
{ T[i].left=-1;
T[i].right=-1;
scanf("%c %c %c\n",&c,&cl,&cr);
if(cl!='-')
{Check[cl-'0']=1;
T[i].left=cl-'0';
}
if(cr!='-')
{Check[cr-'0']=1;
T[i].right=cr-'0';
}
T[i].a=c;
}
for(i=0;i<N;i++)
{
if(Check[i]==0)
out=i;
}
return out;
}
int Judge(int A,int B)
{ if((A==-1)&&(B==-1))
return 1;
if((A==-1)||(B==-1))
return 0;
if((T1[A]).a!=(T2[B]).a)
return 0;
if(Judge((T1[A]).left,(T2[B]).left)&&Judge((T1[A]).right,(T2[B]).right))
return 1;
else {if(Judge((T1[A]).left,(T2[B]).right)&&Judge((T1[A]).right,(T2[B]).left))
return 1;
else return 0;}
}
int main(void) {
int N1,N2;
int G1,G2;
scanf("%d\n",&N1);
if(N1==0)
{printf("Yes");
return 0;}
G1=BT(N1,T1);
scanf("%d\n",&N2);
G2=BT(N2,T2);
if(N1!=N2)
{
printf("No");
return 0;
}
if(T1[G1].a!=T2[G2].a)
{
printf("No");
return 0;
}
if(Judge(G1,G2)==1)
{
printf("Yes");
return 0;
}
else printf("No");
}