0x01.問題
給定兩個非空二叉樹 s 和 t,檢驗 s 中是否包含和 t 具有相同結構和節點值的子樹。s 的一個子樹包括 s 的一個節點和這個節點的所有子孫。s 也可以看做它自身的一棵子樹。
示例 :
給定的樹 s:(圖1)
給定的樹 t:(圖2)
返回 true,因爲 t 與 s 的一個子樹擁有相同的結構和節點值。
public boolean isSubtree(TreeNode s, TreeNode t)
0x02.簡要思路
- 整體思路是DFS。
- 如果在dfs時,匹配到s爲空,則返回
false
。 - 檢查當前匹配的s的節點與t是否相等。(包括對所有子樹的驗證,單獨列出一個
check
函數)。 - 如果檢查不相等,則再去匹配s的左右子樹。
0x03.解決代碼–DFS
class Solution {
private boolean check(TreeNode s, TreeNode t){
if(s==null){
return t==null;
}
if(t==null){
return s==null;
}
if(s.val!=t.val){
return false;
}
return check(s.left,t.left)&&check(s.right,t.right);
}
private boolean dfs(TreeNode s, TreeNode t){
if(s==null){
return false;
}
return check(s,t)||dfs(s.left,t)||dfs(s.right,t);
}
public boolean isSubtree(TreeNode s, TreeNode t) {
return dfs(s,t);
}
}
ATFWUS --Writing By 2020–05-07