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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

数据结构:静态链表实现树的同构

發布時間:2023/12/18 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构:静态链表实现树的同构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

寫在最前面

按照課程講解的思路來寫,邏輯關系能夠理解清楚了,但是實際運行起來實在是有問題,雖然在PTA上能夠通過。但是我自己看不出問題來,并且,看了一遍又一遍仍然看不出來!(可能自己太笨。。)這就說明有著很嚴肅的問題!
所以,與其這樣糾結,不如按照自己理解的思路來寫一遍。

補充一下題目要求

給定兩棵樹T1和T2。如果T1可以通過若干次左右孩子互換就變成T2,則我們稱兩棵樹是“同構”的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點A、B、G的左右孩子互換后,就得到另外一棵樹。而圖2就不是同構的?,F給定兩棵樹,請你判斷它們是否是同構的。 輸入格式: 輸入給出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 <cstdio> #include <cstdlib>//按題目的意思,存儲樹的是靜態鏈表 //即建一個結構,里面三個變量char型結點字母,int型的左右孩子的位置#define MaxTree 10 //題目的意思:最多十個結點 #define ElementType char #define Tree int #define Null -1Tree BuildTree(struct TreeNode T[]); int Isomorphic(Tree R1, Tree R2);//建一個二叉樹的結構,并用數組的元素指向該結構 struct TreeNode {ElementType Element;Tree Left;Tree Right; }T1[MaxTree], T2[MaxTree]; //這樣就可以直接按題目要求進行逐行讀入了//程序的整體框架 int main() {Tree R1, R2;R1 = BuildTree(T1);//printf("%d\n", R1);R2 = BuildTree(T2);//printf("%d\n", R2);if (Isomorphic(R1, R2)) // 返回1說明同構,返回0說明不同構printf("Yes\n");elseprintf("No\n");return 0;}//建二叉樹 //1、將結點、左右孩子的位置讀入數組結構 //2、通過遍歷數組,找出頭結點 //沒有其他結點指向的就是頭結點,所以可以用一個標志Tree BuildTree(struct TreeNode T[]) {int N;int Isnode[MaxTree] = {0};char cl, cr; //因為有'-'存在,所以先用char型變量暫存,然后再放到結構里scanf("%d\n", &N);if (N) {for (int i = 0; i < N; i++) {scanf("%c %c %c\n", &T[i].Element, &cl, &cr); //'-'在結構里用-1表示if (cl != '-') {T[i].Left = cl - '0'; //在這里可以同時加入對于根結點的判斷Isnode[T[i].Left] = 1;}elseT[i].Left = Null;if (cr != '-') {T[i].Right = cr - '0';Isnode[T[i].Right] = 1;}elseT[i].Right = Null;}//最后遍歷一遍結構數組,Isnode為0的就是頭結點for (int m = 0; m < N; m++) {if (!Isnode[m])return m;}}return Null; }//下面來判斷是否為同構 //都為空樹,直接返回1;一個空一個不空,直接返回0 //都不空:結點不同,直接0;結點相同,再看子樹 //左子樹同不存在,就遞歸調用右子樹 //左子樹存在,看是否相等,不相等就交換左右子樹,再遞歸調用 int Isomorphic(Tree R1, Tree R2) {if ((R1 == Null) && (R2 == Null))return 1;if (((R1 == Null) && (R2 != Null)) || ((R1 != Null) && (R2 == Null)))return 0;if (T1[R1].Element != T2[R2].Element)return 0;if ((T1[R1].Left == Null) &&(T2[R2].Left) == Null)return Isomorphic(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 (Isomorphic(T1[R1].Left, T2[R2].Left) && Isomorphic(T1[R1].Right, T2[R2].Right));elsereturn (Isomorphic(T1[R1].Left, T2[R2].Right) && Isomorphic(T1[R1].Right, T2[R2].Left));}

自己理解的思路

#include <cstdio> #include <cstdlib>#define MaxTree 10 #define Null -1struct TreeNode {char Element;int Left;int Right; }T1[MaxTree], T2[MaxTree];int MadeTree (struct TreeNode T[]); int Isomorphic(int R1, int R2);int main() {int R1, R2;R1 = MadeTree(T1);R2 = MadeTree(T2);if (Isomorphic(R1, R2))printf("Yes\n");elseprintf("No\n");return 0; }int MadeTree(struct TreeNode T[]) {int N;scanf("%d\n", &N);if (!N)return Null;else {char l,r;int Root[MaxTree] = {0};for (int i = 0; i < N; i++) {scanf("%c %c %c\n", &T[i].Element, &l, &r);if (l != '-') {T[i].Left = l - '0';Root[T[i].Left] = 1;}elseT[i].Left = Null;if (r != '-') {T[i].Right = r - '0';Root[T[i].Right] = 1;}elseT[i].Right = Null;}for (int m = 0; m < N; m++) {if (!Root[m])return m;}}return Null; }int Isomorphic(int R1, int R2) {if ((R1 == Null) && (R2 == Null))return 1;if (((R1 == Null) && (R2 != Null)) || ((R1 != Null) && (R2 == Null)))return 0;if (T1[R1].Element != T2[R2].Element)return 0;if ((T1[R1].Left == Null) && (T2[R2].Left == Null))return Isomorphic(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 (Isomorphic(T1[R1].Left, T2[R2].Left) &&Isomorphic(T1[R1].Right, T2[R2].Right));elsereturn (Isomorphic(T1[R1].Left, T2[R2].Right) &&Isomorphic(T1[R1].Right, T2[R2].Left)); }

但是這樣寫,好像并沒有什么本質的區別,和照抄沒啥兩樣……
然后本地運行還是有問題:不是正常的回車結束。

暫時還沒想明白是啥問題,應該是輸入輸出有關。

轉載于:https://www.cnblogs.com/ZealYoung/p/10841234.html

總結

以上是生活随笔為你收集整理的数据结构:静态链表实现树的同构的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 青青草狠狠干 | 77777av| 不卡视频在线 | 日本网站在线看 | 国产精品久久久久久亚洲av | 一女三黑人理论片在线 | 天堂av网手机版 | 小视频在线免费观看 | 中文字幕 欧美日韩 | 欧美不卡一区二区三区 | 69精品丰满人妻无码视频a片 | 少妇乱淫36部 | 香蕉成人网 | 色哟哟在线免费观看 | 中文字幕精品久久久久人妻红杏1 | 老头糟蹋新婚少妇系列小说 | 国产一区二区小说 | 懂色a v| 国产精品久久久网站 | 欧美性生活视频 | 久久人人爽人人爽人人片亚洲 | 亚洲综合无码一区二区 | 久久网站免费观看 | 国产精品久久久久久久久 | 国产伦理久久精品久久久久 | 久久成人免费视频 | 九九热在线观看 | 激情婷婷在线 | 色综合久久88色综合天天6 | jizzjizz日本人 | 亚洲精品综合在线观看 | 91色站| 操综合网 | a免费视频| 日本一级淫片色费放 | 日韩一区二区三区四区五区六区 | 女上男下动态图 | 波多野结衣在线视频播放 | 婷婷在线免费 | 欧美日韩一区二区在线视频 | 国产免费成人在线视频 | 成人网入口 | 日韩福利影院 | 中文字幕一二三区 | 黄色一级片欧美 | 小视频在线 | 美女一级片 | 欧美成人一区二免费视频软件 | 欧美老女人性生活 | 天天躁夜夜躁狠狠躁 | 含羞草一区二区三区 | 男女激情久久 | 激情综合影院 | 久久国产精品免费 | 黄色片上床 | 国产视频99 | 日韩中文av | 亚洲精品乱码久久久久久黑人 | 国产一级片麻豆 | 91国产免费视频 | 欧美日韩另类一区 | 国产精品v亚洲精品v日韩精品 | 亚洲精品免费在线观看视频 | 亚洲精品一区二区三区精华液 | 69成人网| 亚洲天天在线 | 亚洲乱亚洲乱 | 99热网址 | 国产精久久 | 精品久久久在线观看 | 国产99自拍 | 福利影院在线观看 | 国产最新在线视频 | 久久久久人妻一区精品色欧美 | 欧美xxxx精品| 日韩av影视大全 | 午夜免费激情视频 | 久久久久久久久久99 | 日本少妇一区二区三区 | 在线看亚洲 | 毛片网站在线观看 | 久久日本精品字幕区二区 | 操皮视频| 欧美一卡二卡在线 | 在线你懂的视频 | 超碰在线伊人 | 九九热视频在线观看 | 国产亚洲二区 | a色视频| 国产欧美精品一区二区在线播放 | 激情视频一区二区三区 | 天天噜夜夜噜 | 国产在线视频一区二区 | 欧美激情一区二区三区蜜桃视频 | 日韩二区三区 | www免费视频 | 国产av一区精品 | 黑人巨大国产9丨视频 | 亚洲国产精品无码久久久久高潮 |