题意:给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。判断给定两个二叉树是否是同构树。
思路:我觉得同构即对应节点的孩子相同,即相减后结果为0。所以逐个判断两棵树对应节点的孩子相减的结果是否为0即可判断是否为同构树。因为数据为字母,所以可以用数组下标快速找到每个节点。
#include<stdio.h> struct node{ char right; char left; }al1[26],al2[26]; //构建两颗树,其中下标即为树节点的值 int main() { int N,i; char c1[10],r1[10],l1[10]; char c2[10],r2[10],l2[10]; scanf("%d",&N); getchar(); for(i=0;i<N;i++){ //读入第一棵树数据 scanf("%c %c %c",&c1[i],&r1[i],&l1[i]); getchar(); } for(i=0;i<N;i++){ //构建第一棵树 al1[c1[i]-'A'].right=r1[i]=='-'?'-':c1[r1[i]-'0']; al1[c1[i]-'A'].left=l1[i]=='-'?'-':c1[l1[i]-'0']; } /*for(i=0;i<N;i++){ //判断树是否构建准确 printf("%c %c %c\n",c1[i],al1[c1[i]-'A'].right,al1[c1[i]-'A'].left); }*/ scanf("%d",&N); //第二棵树 getchar(); for(i=0;i<N;i++){ scanf("%c %c %c",&c2[i],&r2[i],&l2[i]); getchar(); } for(i=0;i<N;i++){ al2[c2[i]-'A'].right=r2[i]=='-'?'-':c2[r2[i]-'0']; al2[c2[i]-'A'].left=l2[i]=='-'?'-':c2[l2[i]-'0']; } for(i=0;i<N;i++){ //判断两棵树对应节点的孩子是否相等 if((al1[c1[i]-'A'].left+al1[c1[i]-'A'].right-al2[c1[i]-'A'].left-al2[c1[i]-'A'].right)!=0)break; //不相等 } if(i==N)printf("Yes"); //全部相等 else printf("No"); return 0; }