1. 程式人生 > 實用技巧 >leetcode-572-另一個樹的子樹

leetcode-572-另一個樹的子樹

目錄


本題是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);
    }

你的鼓勵也是我創作的動力

打賞地址