【面試題04 10】檢查子樹

題目

題目鏈接

檢查子樹。你有兩棵非常大的二叉樹:T1,有幾萬個節點;T2,有幾萬個節點。設計一個算法,判斷 T2 是否爲 T1 的子樹。

如果 T1 有這麼一個節點 n,其子樹與 T2 一模一樣,則 T2 爲 T1 的子樹,也就是說,從節點 n 處把樹砍斷,得到的樹與 T2 完全相同。

示例1:

 輸入:t1 = [1, 2, 3], t2 = [2]
 輸出:true

示例2:

 輸入:t1 = [1, null, 2, 4], t2 = [3, 2]
 輸出:false

提示:

樹的節點數目範圍爲[0, 20000]。

方法一

t2是t1的子集所以若t2中包含t1,則如果能我們找到t1和t2相同的val並且遞歸遍歷 直到t2等於null(t2遍歷完) 如果都相等,則證明t2是t1的子集。
具體實現
遞歸終止條件
1.當t1等於null並且t2不等於null 說明t1中一定不包含t2.
2.當t1中包含t2 並且t2爲null 說明t1中一定包含t2.

如果找到t1和t2相同,則遞歸判斷t1的左節點和t2的左節點是否相等,t1的右節點和t2的右節點是否相等,都相等則t1包含t2

如果沒有找到t1和t2相同,那就繼續找,遞歸遍歷t1的左節點是否等於t2,t1的右節點是否等於t2.都找不到則證明t1不包含t2

遞歸真的很佛系,如果你覺得麻煩,請看第二種方法

/**
 * @description: 檢查子樹
 * @Author MRyan
 * @Date 2020/6/18 09:44
 * @Version 1.0
 */
class Solution {

    public boolean checkSubTree(TreeNode node1, TreeNode node2) {
        return solve(node1, node2);
    }

    public boolean solve(TreeNode node1, TreeNode node2) {
        if (node2 == null) {
            return true;
        }
        if (node1 == null && node2 != null) {
            return false;
        }
        if (node1.val == node2.val) {
            return solve(node1.left, node2.left) && solve(node1.right, node2.right);
        } else {
            return solve(node1.left, node2) || solve(node1.right, node2);
        }
    }


}

方法二

巧妙運用工具。
具體實現:
中序遍歷t1得到t1的字符串。
中序遍歷t2得到t2的字符串。
將求樹t1是否包含樹t2轉換爲求字符串t1是否包含字符串t2。
利用StringBuffer 簡單!

/**
 * @description: 檢查子樹
 * @Author MRyan
 * @Date 2020/6/18 09:44
 * @Version 1.0
 */
class Solution {
    public StringBuffer stringBuffer1 = new StringBuffer("");
    public StringBuffer stringBuffer2 = new StringBuffer("");
    public boolean checkSubTree(TreeNode t1, TreeNode t2) {

        solve(t1, stringBuffer1);
        solve(t2, stringBuffer2);
        boolean check = check(stringBuffer1.toString(), stringBuffer2.toString());
        return check;
    }

    public boolean check(String s1, String s2) {
        return s1.contains(s2);
    }

    public void solve(TreeNode root, StringBuffer stringBuffer) {
        if (root == null) {
            return;
        }
        stringBuffer.append(root.val);
        solve(root.left, stringBuffer);
        solve(root.right, stringBuffer);
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章