1. 程式人生 > >PTA 資料結構與演算法題目集(中文)5-3 樹的同構 (25分)

PTA 資料結構與演算法題目集(中文)5-3 樹的同構 (25分)

#include <stdio.h>
#include <string.h>
/*
題目以26個大寫字母為結點值,可以建立一個26*2的二維陣列 表示結點以及結點的左右結點
若只有一個結點,則判斷兩根是否相同
若有多節點,則先將前一棵樹的結點的左右結點賦給對應的結點,
再判斷後一棵樹的左右結點值在對應的結點是否能找到 
*/
struct cow
{
char date,l,r;
}co[11];
int f1(int i)
{
if(co[i].l=='-')return 0;
return co[co[i].l-'0'].date;
}
int f2(int i)
{
if(co[i].r=='-')return 0;
return co[co[i].r-'0'].date;
}
void pt(char t[26][2],int n)
{
for(int i=0;i<n;i++)
{
int l=f1(i),r=f2(i);
if(l!=t[co[i].date-'A'][0]&&l!=t[co[i].date-'A'][1])
{
printf("No\n");
return;
}
if(r!=t[co[i].date-'A'][0]&&r!=t[co[i].date-'A'][1])
{
printf("No\n");
return;
}
}
printf("Yes\n");
}
int main()
{
char t[26][2];
memset(t,0,sizeof(t));
int n,m;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf(" %c %c %c",&co[i].date,&co[i].l,&co[i].r);
for(int i=0;i<n;i++)
{
if(co[i].l!='-')t[co[i].date-'A'][0]=co[co[i].l-'0'].date;
if(co[i].r!='-')t[co[i].date-'A'][1]=co[co[i].r-'0'].date;
}
char a;
if(n==1)a=co[0].date;
scanf("%d",&m);
for(int i=0;i<m;i++)
scanf(" %c %c %c",&co[i].date,&co[i].l,&co[i].r);
if(n!=m)printf("No\n");
else
{
if(m==1)
{
if(co[0].date!=a)printf("No\n");
else printf("Yes\n");
}
else
pt(t,n);
}
return 0;
}