17 圖解劍指Offer 樹的子結構 Java題解

17 圖解劍指Offer 樹的子結構 Java題解

題目鏈接

題目描述

輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)

題解:

1.判斷root1和root2是否爲null 如果爲null 返回 false。
2. 返回 check(root1, root2) || HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2)這三個任意一個條件成立,root2即爲root1的子結構。(1) check(root1, root2)檢查root1的值和root2的值是否相等 (2)HasSubtree(root1.left, root2) 判斷 root2是否爲root1左子樹的子結構,另一個是判斷右子樹。
3.實現check();(1)首先判斷root2是否爲null,如果爲null,則代表roo2已匹配完,返回true。
(2)如果root1 爲null root2不爲null,肯定不匹配,返回false。
(3)如果 root1.val = root2.val return check(root1.left, root2.left) &&
check(root1.right, root2.right) 否則代表值不等,返回false。

4.check的遞歸終止條件: 如果root2的值一直與root1相等,那麼root2.left和root2.right最後爲null時代表有子結構,root1.left和right爲null代表無子結構。

圖解:

在這裏插入圖片描述

代碼:

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if(root1 == null || root2 == null){
            return false;
        }
        return check(root1, root2) || 
               HasSubtree(root1.left, root2) ||
               HasSubtree(root1.right, root2);
    }
    public boolean check(TreeNode root1, TreeNode root2){
        //要先判斷roo2, 不然{8,8,7,9,2,#,#,#,#,4,7},{8,9,2}這個測試用例通不過。
        if(root2 == null)
            return true;
        if(root1 == null)
            return false;
        if(root1.val == root2.val){
            return check(root1.left, root2.left) && 
                check(root1.right, root2.right);
        }else
            return false;
    }
}

複雜度

空間複雜度: 空間複雜度爲O(1)
最壞時間複雜度: 遞歸時間複雜度O( logn)

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