17 圖解劍指Offer 樹的子結構 Java題解
題目鏈接
題目描述
輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)
題解:
1.判斷root1和root2是否爲null 如果爲null 返回 false。
2. 返回 check(root1, root2) || HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2)這三個任意一個條件成立,root2即爲root1的子結構。(1) check(root1, root2)檢查root1的值和root2的值是否相等 (2)HasSubtree(root1.left, root2) 判斷 root2是否爲root1左子樹的子結構,另一個是判斷右子樹。
3.實現check();(1)首先判斷root2是否爲null,如果爲null,則代表roo2已匹配完,返回true。
(2)如果root1 爲null root2不爲null,肯定不匹配,返回false。
(3)如果 root1.val = root2.val return check(root1.left, root2.left) &&
check(root1.right, root2.right) 否則代表值不等,返回false。
4.check的遞歸終止條件: 如果root2的值一直與root1相等,那麼root2.left和root2.right最後爲null時代表有子結構,root1.left和right爲null代表無子結構。
圖解:
代碼:
/**
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 check(root1, root2) ||
HasSubtree(root1.left, root2) ||
HasSubtree(root1.right, root2);
}
public boolean check(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 check(root1.left, root2.left) &&
check(root1.right, root2.right);
}else
return false;
}
}
複雜度
空間複雜度: 空間複雜度爲O(1)
最壞時間複雜度: 遞歸時間複雜度O( logn)