這篇文章主要為大家展示了“LeetCode中怎么判斷樹(shù)的子結(jié)構(gòu)”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“LeetCode中怎么判斷樹(shù)的子結(jié)構(gòu)”這篇文章吧。
創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站建設(shè)、網(wǎng)站制作、大安網(wǎng)絡(luò)推廣、小程序定制開(kāi)發(fā)、大安網(wǎng)絡(luò)營(yíng)銷、大安企業(yè)策劃、大安品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供大安建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:muchs.cn
問(wèn)題描述
輸入兩棵二叉樹(shù)A和B,判斷B是不是A的子結(jié)構(gòu)。(約定空樹(shù)不是任意一個(gè)樹(shù)的子結(jié)構(gòu))
B是A的子結(jié)構(gòu), 即A中有出現(xiàn)和B相同的結(jié)構(gòu)和節(jié)點(diǎn)值。
例如:
給定的樹(shù) A:
3
/ \
4 5
/ \
1 2
給定的樹(shù) B:
4
/
1
返回 true,因?yàn)?B 與 A 的一個(gè)子樹(shù)擁有相同的結(jié)構(gòu)和節(jié)點(diǎn)值。
示例 1:
輸入:A = [1,2,3], B = [3,1]
輸出:false
示例 2:
輸入:A = [3,4,5,1,2], B = [4,1]
輸出:true
限制:
0 <= 節(jié)點(diǎn)個(gè)數(shù) <= 10000
問(wèn)題分析
要判斷B是否是A的子結(jié)構(gòu),像下面這樣,我們只需要從根節(jié)點(diǎn)開(kāi)始判斷,通過(guò)遞歸的方式比較他的每一個(gè)子節(jié)點(diǎn)即可,所以代碼也很容易寫
1public boolean isSubStructure(TreeNode A, TreeNode B) {
2 //邊界條件判斷,如果A和B有一個(gè)為空,返回false
3 if (A == null || B == null)
4 return false;
5 return isSub(A, B);
6}
7
8boolean isSub(TreeNode A, TreeNode B) {
9 //這里如果B為空,說(shuō)明B已經(jīng)訪問(wèn)完了,確定是A的子結(jié)構(gòu)
10 if (B == null)
11 return true;
12 //如果B不為空A為空,或者這兩個(gè)節(jié)點(diǎn)值不同,說(shuō)明B樹(shù)不是
13 //A的子結(jié)構(gòu),直接返回false
14 if (A == null || A.val != B.val)
15 return false;
16 //當(dāng)前節(jié)點(diǎn)比較完之后還要繼續(xù)判斷左右子節(jié)點(diǎn)
17 return isSub(A.left, B.left) && isSub(A.right, B.right);
18}
但實(shí)際上B如果是A的子結(jié)構(gòu)的話,不一定是從根節(jié)點(diǎn)開(kāi)始的,也可能是下面這樣
也就是說(shuō)B不光有可能是A的子結(jié)構(gòu),也有可能是A左子樹(shù)的子結(jié)構(gòu)或者右子樹(shù)的子結(jié)構(gòu),所以如果從根節(jié)點(diǎn)判斷B不是A的子結(jié)構(gòu),還要繼續(xù)判斷B是不是A左子樹(shù)的子結(jié)構(gòu)和右子樹(shù)的子結(jié)構(gòu),代碼如下
1public boolean isSubStructure(TreeNode A, TreeNode B) {
2 if (A == null || B == null)
3 return false;
4 //先從根節(jié)點(diǎn)判斷B是不是A的子結(jié)構(gòu),如果不是在分別從左右兩個(gè)子樹(shù)判斷,
5 //只要有一個(gè)為true,就說(shuō)明B是A的子結(jié)構(gòu)
6 return isSub(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);
7}
8
9boolean isSub(TreeNode A, TreeNode B) {
10 //這里如果B為空,說(shuō)明B已經(jīng)訪問(wèn)完了,確定是A的子結(jié)構(gòu)
11 if (B == null)
12 return true;
13 //如果B不為空A為空,或者這兩個(gè)節(jié)點(diǎn)值不同,說(shuō)明B樹(shù)不是
14 //A的子結(jié)構(gòu),直接返回false
15 if (A == null || A.val != B.val)
16 return false;
17 //當(dāng)前節(jié)點(diǎn)比較完之后還要繼續(xù)判斷左右子節(jié)點(diǎn)
18 return isSub(A.left, B.left) && isSub(A.right, B.right);
19}
以上是“LeetCode中怎么判斷樹(shù)的子結(jié)構(gòu)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
分享名稱:LeetCode中怎么判斷樹(shù)的子結(jié)構(gòu)
標(biāo)題路徑:http://muchs.cn/article6/gjsgig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)、服務(wù)器托管、網(wǎng)站建設(shè)、微信小程序、Google、網(wǎng)站營(yíng)銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)