【视频讲解】基础实验4-2.1 树的同构 (25 分)
立志用最少的代碼做最高效的表達
給定兩棵樹T1和T2。如果T1可以通過若干次左右孩子互換就變成T2,則我們稱兩棵樹是“同構”的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點A、B、G的左右孩子互換后,就得到另外一棵樹。而圖2就不是同構的。
現給定兩棵樹,請你判斷它們是否是同構的。
輸入格式:
輸入給出2棵二叉樹樹的信息。對于每棵樹,首先在一行中給出一個非負整數N (≤10),即該樹的結點數(此時假設結點從0到N?1編號);隨后N行,第i行對應編號第i個結點,給出該結點中存儲的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
視頻講解連接——>傳送門
#include<iostream> #include<cstdio> #include<cstdlib> #define maxTree 10 #define Tree int #define Null -1using namespace std;struct TreeNode {char element;Tree left, right; }T1[maxTree], T2[maxTree]; int check[11] = {0};Tree BuildTree(struct TreeNode T[]) {int n, i, root = Null; //root的初始值為-1char cl, cr; cin >> n; //節點數量 if(n) {for(i = 0; i < n; i++) check[i] = 0;for(i = 0; i < n; i++) {cin >> T[i].element >> cl >> cr;if(cl != '-') {T[i].left = cl-'0';check[T[i].left] = 1; //證明該節點被指向 }else T[i].left = Null; //否則的話,左節點值為-1if(cr != '-') {T[i].right = cr-'0';check[T[i].right] = 1;} else T[i].right = Null;}for(i = 0; i < n; i++) //從頭遍歷,如果有沒被指向的節點,則一定為根節點 if(!check[i]) break;root = i; //根節點賦值 } return root; }int iso(Tree R1, Tree R2) {//判斷是否同構:結構是否相等(左右子樹是否都可以遍歷 + 元素相等) //1、如果是正常結束,則返回1 if((R1 == Null) && (R2 == Null)) return 1;//2、如果有一方提前結束,則返回0 if((R1==Null) && (R2!=Null) || (R1!=Null)&&(R2==Null))return 0;//3、如果元素不相等,返回0 if(T1[R1].element != T2[R2].element)return 0;//4、如果左子樹空了,則只遍歷右子樹 if(T1[R1].left == Null && T2[R2].left == Null)return iso(T1[R1].right, T2[R2].right);//如果左子樹沒空,并且雙方左子樹的元素值相等//則按正常情況分別遍歷左子樹和右子樹 if((T1[R1].left!=Null && T2[R2].left!=Null) && T1[T1[R1].left].element==T2[T2[R2].left].element)return (iso(T1[R1].left, T2[R2].left) && iso(T1[R1].right, T2[R2].right));else return (iso(T1[R1].left, T2[R2].right) && iso(T1[R1].right, T2[R2].left)); }int main() {/*建二叉樹1建二叉樹2判斷是否同構并輸出 */Tree R1, R2;R1 = BuildTree(T1); //參數為結構體數組 R2 = BuildTree(T2);if(iso(R1, R2)) printf("Yes\n");else printf("No\n");return 0; }
總結
以上是生活随笔為你收集整理的【视频讲解】基础实验4-2.1 树的同构 (25 分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【解析】案例4-1.7 文件传输 (25
- 下一篇: 【已解决】Error: Module n