日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【视频讲解】基础实验4-2.1 树的同构 (25 分)

發布時間:2024/2/28 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【视频讲解】基础实验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 分)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。