树的同构

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

 


 

图1

图2

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

 

输入格式:

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

输出格式:

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

输入样例1(对应图1):

 1 8
 2 A 1 2
 3 B 3 4
 4 C 5 -
 5 D - -
 6 E 6 -
 7 G 7 -
 8 F - -
 9 H - -
10 8
11 G - 4
12 B 7 6
13 F - -
14 A 5 1
15 H - -
16 C 0 -
17 D - -
18 E 2 -

输出样例1:

Yes

输入样例2(对应图2):

 1 8
 2 B 5 7
 3 F - -
 4 A 0 3
 5 C 6 -
 6 H - -
 7 D - -
 8 G 4 -
 9 E 1 -
10 8
11 D 6 -
12 B 5 -
13 E - -
14 H - -
15 C 0 2
16 G - 3
17 F - -
18 A 1 4

输出样例2:

No

 

 

 1 #include <stdio.h>
 2 
 3 #define MaxTree 10
 4 #define ElementType char
 5 #define Tree int
 6 #define Null -1 
 7 int check[MaxTree];
 8 
 9 struct TreeNode
10 {
11     ElementType Element;
12     Tree Left;
13     Tree Right; 
14 }T1[MaxTree],T2[MaxTree];
15 
16 Tree BuildTree(struct TreeNode T[])
17 {
18     int N,i;
19     char cl,cr;
20     Tree Root;
21     scanf("%d\n",&N);
22     if(N)
23     {
24         for(i=0;i<N;i++)
25         {
26             check[i]=0;
27         }
28         for(i=0;i<N;i++)
29         {
30             scanf("%c %c %c\n",&T[i].Element,&cl,&cr);
31             if(cl!='-')
32             {
33                 T[i].Left=cl-'0';
34                 check[T[i].Left]=1;
35             }
36             else T[i].Left=Null;
37             if(cr!='-')
38             {
39                 T[i].Right=cr-'0';
40                 check[T[i].Right]=1;
41             }
42             else T[i].Right=Null;
43         }
44         for(i=0;i<N;i++)
45         {
46             if(!check[i]) break;
47         }
48         Root = i;
49     }
50     else 
51     {
52         Root=0;
53         T[Root].Left=Null;
54         T[Root].Right=Null;
55     }
56     return Root;
57 }
58 
59 int Isomorphic(Tree R1,Tree R2)
60 {
61     if((R1==Null)&&(R2==Null))
62         return 1;
63     if(((R1==Null)&&(R2!=Null))||((R1!=Null)&&(R2==Null)))
64         return 0;
65     if(T1[R1].Element!=T2[R2].Element)
66         return 0;
67     if((T1[R1].Left==Null)&&(T2[R2].Left==Null))
68         return Isomorphic(T1[R1].Right,T2[R2].Right);
69     if(((T1[R1].Left!=Null)&&(T2[R2].Left!=Null))&&
70         ((T1[T1[R1].Left].Element)==(T2[T2[R2].Left].Element)))
71         return (Isomorphic(T1[R1].Left,T2[R2].Left)&&Isomorphic(T1[R1].Right,T2[R2].Right));
72     else 
73         return (Isomorphic(T1[R1].Left,T2[R2].Right)&&Isomorphic(T1[R1].Right,T2[R2].Left));
74 }
75 
76 int main()
77 {
78     Tree R1,R2;
79     R1=BuildTree(T1);//建二叉树1
80     R2=BuildTree(T2);//建二叉树2
81     if(Isomorphic(R1,R2))//判断是否同构
82         printf("Yes\n");
83     else printf("No\n");
84     return 0;
85 }

 

 

posted @ 2019-04-15 23:08  jiamian22  阅读(244)  评论(0编辑  收藏  举报