劍指offer17-樹的子結構
最近全國疫情嚴重,待在家裏沒事幹,馬上又要準備春招了,最近刷刷題,記錄一下!再說一句,武漢加油,大家出門記得戴口罩!
1、題目描述
輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)
2、思路
要查找樹A中是否存在和樹B結構一樣的子樹,我們可以分爲兩步:第一步,在樹A中找到和樹B的根結點值一樣的結點R;第二步,判斷樹A中以R爲根結點的子樹是不是包含和樹B一樣的結構,B樹有的子節點,A樹必須有;B樹沒有的子節點,A樹可以有。
對於這兩步,第一步實際上就是樹的遍歷,第二步是判斷是否有相同的結構,這兩步都可以通過遞歸來實現。
3、代碼
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
/*
1、尋找相同的根節點
*/
if(root1==null||root2==null)
return false;
if(root1.val==root2.val && isContain(root1,root2))
return true;
return HasSubtree(root1.left,root2)||HasSubtree(root1.right,root2);
}
/*
2、比較是否包含
*/
public boolean isContain(TreeNode node1,TreeNode node2) {
//我爲空,你不爲空,說明我不包含你
if(node1==null&&node2!=null)
return false;
//咱兩都空,等於值相同
if(node2==null)
return true;
return node1.val==node2.val && isContain(node1.left,node2.left) && isContain(node1.right,node2.right);
}
}