1. 程式人生 > >劍指offer:樹的子結構

劍指offer:樹的子結構

試題: 輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構) 程式碼: 按照正常思維,我們都知道要一個個搜搜樹的節點,每到一個節點,就和樹B比較一次。因此 我們使用深度搜索來搜尋樹的每個節點。首先我們假設B和A都非null,這時我們可以寫出遞迴遍歷,因為每到下一個A節點,問題就又變成原始問題了。然後我們考慮遞迴終止條件,顯然只要遍歷到當前節點為null就可以返回了(該路徑搜尋完成,應該返回false)。那麼該如何返回是個問題,因為我們只需要找到一個滿足條件就可以返回,因此最終形式以||的關係。然後只需要把A或B等於null的邊界條件加進去。 然後我們考慮如何比較子樹,顯然這又是個遞迴問題。只要當前節點值相等我們就可以繼續比較下一節點,由於所有節點都要滿足相等,所以以&&的形式返回。然後就是終止條件的考慮。當我們遍歷到B的葉子節點時,當其為null,我們可以對當前路徑返回true,如果不為null,則有兩種可能性,要不可以繼續比較,要不A下一節點為null了

BFS廣度優先搜尋 DFS深度優先搜尋 回溯演算法

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

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

    }

}
*/
public class Solution {
    private boolean isSubTree(TreeNode root1,TreeNode root2) {
        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;
    }
    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);
    }
}