SDUT数据结构实验之二叉树一:树的同构

题目描述

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




图1

 


图2

现给定两棵树,请你判断它们是否是同构的。

输入

  输入数据包含多组,每组数据给出 2 棵二叉树的信息。对于每棵树,首先在一行中给出一个非负整数 N ( 10) ,即该树的结点数(此时假设结点从 0 N−1 编号);随后 N 行,第 i 行对应编号第 i 个结点,给出该结点中存储的 1 个英文大写字母、其左孩子结点的编号、右孩子结点的编号。如果孩子结点为空,则在相应位置上给出 ”-” 。给出的数据间用一个空格分隔。
注意:题目保证每个结点中存储的字母是不同的。

输出

  如果两棵树是同构的,输出“ Yes”,否则输出“No”。

示例输入

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
#include
#include
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   {
   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   {
   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     if(q[j]->data==p[0]->data)
     break;
   if(j                 panduan(p,q,0,j);
   else if(j==m)
   {
    k=0;
    printf("No\n");
   }
  }
  if(k==1)
   printf("Yes\n");
 }
}

你可能感兴趣的:(SDUT数据结构实验之二叉树一:树的同构)