劍指offer 17:樹的子結構--- Java實現

劍指offer每日一題算法題(java解法)

方便日後複習,從今天開始。

算法之行始於足下

[編程題]樹的子結構-- Java實現

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

解題思路:
1.本題用了註釋,所以可以直接讀代碼;

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    //判斷A的哪一個子樹與B的值相等,相等就進入isSubTree()方法
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if(root2==null){
            return false;
        }if(root2!=null&&root1==null){  //如果B的樹比A長或者長得不一樣
            return false;
        }
        boolean flag = false;
        if(root1.val==root2.val){    //如果A的值與B相等
             flag = isSubTree(root1,root2);  //進入子節點比較
        }
        if(!flag){       //當A的值不等於B的值的時候
            flag=HasSubtree(root1.left,root2);   // 遞推調用一次A的左子樹和B的值比較
            if(!flag){         //如果A的左子樹和B還是不等
                flag=HasSubtree(root1.right,root2); // 遞推調用一次A的右子樹和B的值比較
            }
        }
        return flag;
    }
    //這個方法來判斷A和B的第一個節點對上之後,比較子樹的情況
    public boolean isSubTree(TreeNode root1,TreeNode root2) {
        if(root2==null) return true;
        if(root1==null&&root2!=null) return false;  //當A遍歷完了,B還有子節點,所以返回fasle
        if(root1.val==root2.val){
            //如果兩個值相等,就遞推調用A和B的左子樹判斷,再判斷右子樹的情況
            return isSubTree(root1.left, root2.left) && isSubTree(root1.right, root2.right);
        }else{   //不等就直接錯誤
        return false;
        }
    }
}
發佈了56 篇原創文章 · 獲贊 11 · 訪問量 2039
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章