【无取巧解法,易于理解!】剑指 Offer 26. 树的子结构
生活随笔
收集整理的這篇文章主要介紹了
【无取巧解法,易于理解!】剑指 Offer 26. 树的子结构
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
看題解時(shí),很多大牛用很少的代碼就完成了AC,但可能看了很多遍也看不懂,因此萌生了寫一種最“笨”最完整的代碼的想法,這樣大家可以通過我的代碼入門,看懂了再去挑戰(zhàn)大牛們的簡潔解法。
輸入兩棵二叉樹A和B,判斷B是不是A的子結(jié)構(gòu)。(約定空樹不是任意一個(gè)樹的子結(jié)構(gòu))
B是A的子結(jié)構(gòu), 即 A中有出現(xiàn)和B相同的結(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
核心思路
1、找到哪種樹滿足遞歸的條件
2、對上述三種樹進(jìn)行判斷
判斷條件:兩棵樹在該節(jié)點(diǎn)的值是否相等,并且遞歸其左子樹和右子樹,重復(fù)上述判斷
3、至此,我們將這道題拆分成了兩步,但無論是找樹,還是對樹進(jìn)行同構(gòu)判斷,都需要進(jìn)行遞歸。因此我們需要寫兩個(gè)方法來進(jìn)行遞歸處理。 代碼如下。
注意:解樹相關(guān)的題,最重要的兩個(gè)關(guān)鍵詞是遞歸和魯棒性(魯棒性即對空指針進(jìn)行處理,保證程序的健壯性)
代碼一:普通解法
static class Solution{// 什么樣的樹滿足條件public boolean isSubStructure(TreeNode A, TreeNode B) {if(A == null || B == null)return false;if((A.val == B.val) && (dfs(A.left, B.left) && dfs(A.right, B.right)))return true;return isSubStructure(A.left, B) || isSubStructure(A.right, B);}// 判斷某種樹滿足條件的過程public boolean dfs(TreeNode A, TreeNode B) {if(B == null)return true;if(A == null)return false;if(A.val == B.val)return dfs(A.left, B.left) && dfs(A.right, B.right);elsereturn false;} }代碼二:簡潔解法
class Solution{public boolean isSubStructure(TreeNode A, TreeNode B) {if(A == null && B == null) return false;return dfs(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);}public boolean dfs(TreeNode A, TreeNode B) {if(B == null) return true;if(A == null || A.val != B.val) return false;return dfs(A.left,B.left) && dfs(A.right, B.right);} }孤獨(dú)是非常有必要的,一個(gè)人在孤獨(dú)時(shí)間所做的事情,決定了這個(gè)人和其他人根本的不同
總結(jié)
以上是生活随笔為你收集整理的【无取巧解法,易于理解!】剑指 Offer 26. 树的子结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【最佳解法】剑指 Offer 25. 合
- 下一篇: 剑指 Offer 27. 二叉树的镜像【