题目描述
给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。

图1

图2
现给定两棵树,请你判断它们是否是同构的。
输入
注意:题目保证每个结点中存储的字母是不同的。
输出
示例输入
8 A 1 2 B 3 4 C 5 - D - - E 6 - G 7 - F - - H - - 8 G - 4 B 7 6 F - - A 5 1 H - - C 0 - D - - E 2 -
示例输出
Yes
我的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct hh
{
char data;
int l;
int r;
};
int k;
void panduan(struct hh *p[],struct hh *q[],int x,int y)
{
if(k==1)
{
if(p[x]->l!=-1&&p[x]->r!=-1&&q[y]->l!=-1&&q[y]->r!=-1)
{
if(p[x]->data==q[y]->data)
{
if(p[p[x]->l]->data==q[q[y]->l]->data&&p[p[x]->r]->data==q[q[y]->r]->data)
{
panduan(p,q,p[x]->l,q[y]->l);
panduan(p,q,p[x]->r,q[y]->r);
}
else if(p[p[x]->l]->data==q[q[y]->r]->data&&p[p[x]->r]->data==q[q[y]->l]->data)
{
panduan(p,q,p[x]->l,q[y]->r);
panduan(p,q,p[x]->r,q[y]->l);
}
else
{
k=0;
printf("No\n");
}
}
else
{
k=0;
printf("No\n");
}
}
else if(p[x]->l!=-1&&p[x]->r==-1&&q[y]->l!=-1&&q[y]->r==-1)
{
if(p[p[x]->l]->data==q[q[y]->l]->data)
{
panduan(p,q,p[x]->l,q[y]->l);
}
else
{
k=0;
printf("No\n");
}
}
else if(p[x]->l==-1&&p[x]->r!=-1&&q[y]->l==-1&&q[y]->r!=-1)
{
if(p[p[x]->r]->data==q[q[y]->r]->data)
{
panduan(p,q,p[x]->r,q[y]->r);
}
else
{
k=0;
printf("No\n");
}
}
else if(p[x]->l!=-1&&p[x]->r==-1&&q[y]->l==-1&&q[y]->r!=-1)
{
if(p[p[x]->l]->data==q[q[y]->r]->data)
{
panduan(p,q,p[x]->l,q[y]->r);
}
else
{
k=0;
printf("No\n");
}
}
else if(p[x]->l==-1&&p[x]->r!=-1&&q[y]->l!=-1&&q[y]->r==-1)
{
if(p[p[x]->r]->data==q[q[y]->l]->data)
{
panduan(p,q,p[x]->r,q[y]->l);
}
else
{
k=0;
printf("No\n");
}
}
else if(p[x]->l==-1&&p[x]->r==-1&&q[y]->l==-1&&q[y]->r==-1);
else
{
k=0;
printf("No\n");
}
}
}
void main()
{
char x;
int n,i,m,j;
struct hh *q[15],*p[15];
while(scanf("%d",&n)!=EOF)
{
k=1;
for(i=0;i<n;i++)
{
p[i]=(struct hh *)malloc(sizeof(struct hh));
scanf("%s",&x);
p[i]->data=x;
scanf("%s",&x);
if(x!='-')
p[i]->l=x-'0';
else
p[i]->l=-1;
scanf("%s",&x);
if(x!='-')
p[i]->r=x-'0';
else
p[i]->r=-1;
}
scanf("%d",&m);
for(i=0;i<m;i++)
{
q[i]=(struct hh *)malloc(sizeof(struct hh));
scanf("%s",&x);
q[i]->data=x;
scanf("%s",&x);
if(x!='-')
q[i]->l=x-'0';
else
q[i]->l=-1;
scanf("%s",&x);
if(x!='-')
q[i]->r=x-'0';
else
q[i]->r=-1;
}
if(n!=m)
{
k=0;
printf("No\n");
}
else if(n==0&&m==0)
;
else
{
for(j=0;j<m;j++)
if(q[j]->data==p[0]->data)
break;
if(j<m)
panduan(p,q,0,j);
else if(j==m)
{
k=0;
printf("No\n");
}
}
if(k==1)
printf("Yes\n");
}
}
3063

被折叠的 条评论
为什么被折叠?



