題目描述:
輸入兩棵二叉樹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);
}