數據結構:靜態鏈表實現樹的同構

寫在最前面

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

補充一下題目要求

給定兩棵樹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 <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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449016.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449016.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449016.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

中國人為什么學不會英語

英語永遠也學不會! 這種抱怨和哀嘆&#xff0c;大概在中國早已經司空見慣了。于是&#xff0c;有人開始計算學英語是多么大的浪費。 作為過來人&#xff0c;我對此深有體會。記得我當年也有過類似的絕望感。 但是&#xff0c;一位前輩安慰我說&#xff1a;你可以說你永遠掌…

研究人員發現:基于文本的AI模型容易受到改述攻擊

由于自然語言處理&#xff08;NLP&#xff09;的進步&#xff0c;越來越多的公司和組織開始利用AI算法來執行與文本相關的任務&#xff0c;例如&#xff1a;過濾垃圾郵件、分析社交媒體帖子和評論、評估簡歷以及檢測假新聞。 但是&#xff0c;真的可以相信這些算法能夠可靠地執…

解決 linux 下安裝 node 報: command not found

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 注意&#xff1a;有時安裝成功后,需要關閉xshell&#xff0c;重新啟動。nvm才會生效。 1. 在 linux 下安裝 node 提示 -bash: node: com…

阿里云官方網站免費套餐怎么搶

阿里云推出包含云服務器 ECS、負載均衡、云數據庫 RDS、云數據庫 Redis 版、云數據庫 Mongodb 版、彈性公網 IP、CDN、對象存儲 OSS、文件存儲 NAS等40核心云產品&#xff0c;6個月免費使用何為免費套餐&#xff0c;其實就是讓你先體驗&#xff0c;覺得好用&#xff0c;易用&am…

1003 我要通過

1003 我要通過&#xff01; (20 分)“答案正確”是自動判題系統給出的最令人歡喜的回復。本題屬于 PAT 的“答案正確”大派送 —— 只要讀入的字符串滿足下列條件&#xff0c;系統就輸出“答案正確”&#xff0c;否則輸出“答案錯誤”。 得到“答案正確”的條件是&#xff1a; …

在英特爾? 凌動? 處理器上將 OpenGL* 游戲移植到 Android* (第一部分)

將游戲和其他使用大量 3D 圖形的應用從 OpenGL 標準移植到 Google Android 設備&#xff08;包括構建在英特爾 凌動? 微架構上的設備&#xff09;存在巨大的機遇&#xff0c;因為基于 OpenGL 的游戲、游戲引擎和其他傳統軟件易于獲得&#xff1b;OpenGL 便于移植&#xff1b;而…

文件系統:使用 yum 安裝軟件包

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、yum命令的基本安裝功能 [rootlocalhost ~]# man yum command is one of: * install package1 [package2] [...]&#xff1a; ins…

elasticsearch全局analyzer聲明

2019獨角獸企業重金招聘Python工程師標準>>> 問題 elasticsearch從2.4升級到5.6&#xff0c;elasticsearch.yml配置中有一些analyzer配置拷貝到新版本&#xff0c;啟動報錯 index :analysis :analyzer :lowercase_whitespace :type : customtokenizer : myTokenizer…

Parallels Desktop虛擬機無法關機提示“虛擬機處理器已被操作系統重置”

如果你在使用PD的時候遇到了這樣子的彈窗&#xff0c;恭喜你篇博文可以幫助你&#xff0c;因為我剛剛也遇到了這個問題。如果有幫助可以點一下推薦按鈕。 針對Windows電腦 啟動虛擬機創建快照使用管理員權限運行命令提示符執行powercfg -h off重啟試試成功了再刪除快照即可修改…

linux下安裝 ping 命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 使用docker倉庫下載的ubuntu 14.04 鏡像。里面精簡的連 ping 命令都沒有。google 百度都搜索不到ping 命令在哪個包里。 努力找了半天&…

揚尼斯定律:程序員的開發效率每6年提高一倍

我不斷的聽到各種關于“軟件危機”的警言&#xff0c;以及關于軟件開發缺少過程規范的批評。我做編程工作超過15年&#xff0c;我認為這些言論基本上都是錯的&#xff1a;我確信我能在很短的時間里用如今的開發工具復制出15年前一個不錯的程序員開發出的東西。 模仿摩爾定律和…

ApiBoot - ApiBoot Quartz 使用文檔

ApiBoot Quartz ApiBoot內部集成了Quartz&#xff0c;提供了數據庫方式、內存方式的進行任務的存儲&#xff0c;其中數據庫方式提供了分布式集群任務調度&#xff0c;任務自動平滑切換執行節點。 引用ApiBoot Quartz 在pom.xml配置文件內添加&#xff0c;如下配置&#xff1a; …

《算法競賽進階指南》0.4二分

102. 最佳牛圍欄 農夫約翰的農場由N塊田地組成&#xff0c;每塊地里都有一定數量的牛,其數量不會少于1頭&#xff0c;也不會超過2000頭。 約翰希望用圍欄將一部分連續的田地圍起來&#xff0c;并使得圍起來的區域內每塊地包含的牛的數量的平均值達到最大。 圍起區域內至少需要包…

Hibernate 自動創建表

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 在 hibernate.cfg.xml 添加這句話&#xff0c;可以自動生成數據表 : <property name"hibernate.hbm2ddl.auto">upd…

程序員越老越優秀嗎?

Peter Knego 向我們展示了一些有趣的東西&#xff1a; 官方數據&#xff1a;程序員年紀越大越出色、越稀有。他使用StackOverflow的聲譽值和其它幾個指標來印證他的觀點。 他的總結是&#xff1a; 隨著年齡的增加&#xff0c;程序員的數量急劇下降。程序員數量的峰值出現在2…

小程序學習(一):點擊愛心變色 -- 最簡單的事件實現

最近在學習小程序&#xff0c;想通過寫文章來記錄自己的學習歷程&#xff0c;希望能做到每周都寫…… 如何綁定一個事件 微信小程序中&#xff0c;綁定事件要在標簽內寫入這兩段代碼&#xff1a; bindtap"fnActive" data-favourite "{{isLike}}" 復制代碼…

安全通信

安全通信 應用層協議大多數自己都沒有實現加解密功能&#xff0c;比如http等。http就是直接把數據加載進來然后做簡單編碼&#xff08;也就是流式化&#xff09;然后響應客戶端&#xff0c;然后數據在瀏覽器展示&#xff0c;這個數據在傳輸過程是明文的&#xff0c;你截獲就可以…

出現 java.lang.NullPointerException 的幾種原因、可能情況

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。一般報 java.lang.NullPointerException的 原因有以下幾種&#xff1a;1. 字符串變量未初始化 。 2. 接口類型的對象沒有用具體的類初始化…

純JPA 入門小案例(2)

2019獨角獸企業重金招聘Python工程師標準>>> JPA中的主鍵生成策略 通過annotation&#xff08;注解&#xff09;來映射hibernate實體的,基于annotation的hibernate主鍵標識為Id, 其生成規則由GeneratedValue設定的.這里的id和GeneratedValue都是JPA的標準用法。 JPA…

spring IoC/DI

一、spring創建對象的三種方式&#xff1a;1、通過構造方法創建無參構造創建&#xff1a;默認情況有參構造創建&#xff1a;需要明確配置<constructor-arg>中配置index&#xff1a;參數索引name&#xff1a;參數名type&#xff1a;參數類型&#xff08;區分基本數據類型和…