leetcode-572-另一個樹的子樹
阿新 • • 發佈:2020-07-19
目錄
- Posted by 微博@Yangsc_o
- 原創文章,版權宣告:自由轉載-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0
本題是leetcode,地址:572. 另一個樹的子樹
題目
給定兩個非空二叉樹 s 和 t,檢驗 s 中是否包含和 t 具有相同結構和節點值的子樹。s 的一個子樹包括 s 的一個節點和這個節點的所有子孫。s 也可以看做它自身的一棵子樹。
示例 1:
給定的樹 s:示例 1:
給定的樹 s:
3
/
4 5
/
1 2
給定的樹 t:4
/
1 2
返回 true,因為 t 與 s 的一個子樹擁有相同的結構和節點值。示例 2:
給定的樹 s:
3
/
4 5
/
1 2
/
0
給定的樹 t:4
/
1 2
返回 false。
分析
首先想一個問題,如果判斷兩個書是否相等?遞迴呼叫比較每一個節點的數值;
code如下
public boolean isSameTree(TreeNode s, TreeNode t){ // 如果兩個節點都為空,可以認為相同 if(s == null && t == null) return true; // 如果兩個節點一個相同 其中一個是null,肯定不同 if(s == null || t == null) return false; // 如果兩個節點的數值不同,則也不同 if(s.val != t.val) return false; // 遞迴就完了 return isSameTree(s.left,t.left) && isSameTree(s.right,t.right); }
如果有了比較兩個樹是否相同的判斷函式,那麼暴力解法就是列舉第一棵樹的子樹,就是深度遍歷;
code如下:
public boolean dfs(TreeNode s, TreeNode t) {
if(t == null) return true;
if(s == null) return false;
return dfs(s.left,t) || dfs(s.right,t);
}
如此一來,我們就可以寫出完整程式碼:
code
public boolean isSubtree(TreeNode s, TreeNode t) { return dfs(s,t); } public boolean dfs(TreeNode s, TreeNode t) { if(t == null) return true; if(s == null) return false; return dfs(s.left,t) || dfs(s.right,t) || isSameTree(s,t); } public boolean isSameTree(TreeNode s, TreeNode t){ if(s == null && t == null) return true; if(s == null || t == null) return false; if(s.val != t.val) return false; return isSameTree(s.left,t.left) && isSameTree(s.right,t.right); }