二叉樹及其遍歷
給定兩棵樹T1和T2。如果T1可以通過若干次左右孩子互換就變成T2,則我們稱兩棵樹是“同構”的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點A、B、G的左右孩子互換后,就得到另外一棵樹。而圖2就不是同構的。

圖1
圖2
現給定兩棵樹,請你判斷它們是否是同構的。
輸入格式:
輸入給出2棵二叉樹樹的信息。對於每棵樹,首先在一行中給出一個非負整數NN (\le 10≤10),即該樹的結點數(此時假設結點從0到N-1N−1編號);隨后NN行,第ii行對應編號第ii個結點,給出該結點中存儲的1個英文大寫字母、其左孩子結點的編號、右孩子結點的編號。如果孩子結點為空,則在相應位置上給出“-”。給出的數據間用一個空格分隔。注意:題目保證每個結點中存儲的字母是不同的。
輸出格式:
如果兩棵樹是同構的,輸出“Yes”,否則輸出“No”。
輸入樣例1(對應圖1):
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 -
輸出樣例1:
Yes
輸入樣例2(對應圖2):
8
B 5 7
F - -
A 0 3
C 6 -
H - -
D - -
G 4 -
E 1 -
8
D 6 -
B 5 -
E - -
H - -
C 0 2
G - 3
F - -
A 1 4
輸出樣例2:
No
1 #include <stdio.h> 2 3 #define OK 1 4 #define ERROR 0 5 6 #define MaxTree 10 7 #define Null -1 //區別於系統的NULL 0 8 9 typedef int Status;/* Status是函數的類型,其值是函數結果狀態代碼,如OK等 */ 10 typedef char ElementType;/* ElemType類型根據實際情況而定,這里假設為char */ 11 12 typedef struct TreeNode 13 { 14 ElementType data; 15 int left; 16 int right; 17 } Tree; 18 19 Tree T1[MaxTree], T2[MaxTree]; 20 21 int BulidTree(Tree T[]) 22 { 23 int N, check[MaxTree], root = Null; //root = Null 空樹則返回Null 24 char cl, cr; //左右孩子序號 25 scanf("%d\n",&N); 26 if(N) { 27 for(int i = 0; i < N; i++) 28 check[i] = 0; 29 for(int i = 0; i < N; i++) { 30 scanf("%c %c %c\n",&T[i].data,&cl,&cr); 31 //找root 32 if(cl != '-') { 33 T[i].left = cl - '0'; 34 check[T[i].left] = 1; //不是根節點 35 }else { 36 T[i].left = Null; 37 } 38 if(cr != '-') { 39 T[i].right = cr - '0'; 40 check[T[i].right] = 1; //不是根節點 41 }else { 42 T[i].right = Null; 43 } 44 } 45 46 for(int i = 0; i < N; i++) //check[]=0的為根節點 47 if(!check[i]) { 48 root = i; 49 break; 50 } 51 } 52 return root; 53 } 54 Status Isomprphic(int root1, int root2) 55 { 56 if( (root1 == Null) && (root2 == Null))//都是空 ,同構 57 return OK; 58 if( (root1 == Null)&&(root2 != Null) || (root1 != Null)&&(root2 == Null))//其中一個為空,不同構 59 return ERROR; 60 if(T1[root1].data != T2[root2].data) //根數據不同,不同構 61 return ERROR; 62 if( (T1[root1].left == Null) && (T2[root2].left == Null) ) //左子樹為空,則判斷右子樹 63 return Isomprphic(T1[root1].right, T2[root2].right); 64 65 if((T1[root1].left != Null) && (T2[root2].left != Null) && 66 ( T1[T1[root1].left].data == T2[T2[root2].left].data) )//兩樹左子樹皆不空,且值相等 67 return (Isomprphic(T1[root1].left, T2[root2].left) && //判斷其子樹 68 Isomprphic(T1[root1].right, T2[root2].right) ); 69 else //兩樹左子樹有一個空 或者 皆不空但值不等 70 return (Isomprphic(T1[root1].left, T2[root2].right) && //交換左右子樹判斷 71 Isomprphic(T1[root1].right, T2[root2].left) ); 72 73 } 74 75 int main() 76 { 77 int root1, root2; 78 root1 = BulidTree(T1); 79 root2 = BulidTree(T2); 80 if(Isomprphic(root1, root2) ) 81 printf("Yes\n"); 82 else 83 printf("No\n"); 84 return 0; 85 }