【劍指Offer】17、樹的子結構


  題目描述:

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

  解題思路:

  要查找樹A中是否存在和樹B結構一樣的子樹,我們可以分為兩步:第一步,在樹A中找到和樹B的根結點值一樣的結點R;第二步,判斷樹A中以R為根結點的子樹是不是包含和樹B一樣的結構。

  對於這兩步,第一步實際上就是樹的遍歷,第二步是判斷是否有相同的結構,這兩步都可以通過遞歸來實現。

  舉例:

  編程實現(Java):

   public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if(root1==null || root2==null)
            return false;
        boolean res=false;
        if(root1.val==root2.val) //有相同的根節點,判斷第二步
            res=doesTree1HasTree2(root1,root2);
        if(!res) //不滿足,繼續在子樹中查找
            res=HasSubtree(root1.left,root2); //左子樹
        if(!res) //左子樹也沒有找到,右子樹查找
            res=HasSubtree(root1.right,root2); //右子樹
        return res;
    }
    //以R為根的子樹是否包含和樹B相同的結構
    public boolean doesTree1HasTree2(TreeNode root1,TreeNode root2){ 
        if(root2==null)
            return true;
        if(root1==null)
            return false;
        if(root1.val!=root2.val)
            return false;
        return doesTree1HasTree2(root1.left,root2.left) && doesTree1HasTree2(root1.right,root2.right);
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM