劍指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;
}
}
}