天天看點

[劍指offer] 樹的子結構

題目描述

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

解題思路

  • 遞歸思想,如果根節點相同則遞歸調用IsSubtree(),如果根節點不相同,則判斷

    root1

    的左子樹和

    roo2

    是否相同,再判斷右子樹和

    root2

    是否相同;
  • 注意節點為空的條件,

    HasSubTree

    中,隻要有樹為空就傳回

    false

    ;

    IsSubtree

    中,要先判斷

    root2

    ,如果

    root2

    為空,則說明第二棵樹周遊完了,即比對成功。

參考代碼

/**
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 IsSubtree(root1, root2) || 
               HasSubtree(root1.left, root2) ||
               HasSubtree(root1.right, root2);
    }
    public boolean IsSubtree(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 IsSubtree(root1.left, root2.left) && 
                IsSubtree(root1.right, root2.right);
        }else
            return false;
    }
}
           

繼續閱讀