題目:輸入兩棵二叉樹A,B,判斷B是不是A的子結構。
解析:
①從二叉樹A的根節點root開始,判斷此時二叉樹B是否以root開始且以下結點與二叉樹A是否相等,用變量ret保存返回的布爾變量(爲什麼不直接return,因爲B可能從A根節點的右孩子開始爲其子結構或左孩子開始爲其子結構);
②如果A樹有右孩子,將右孩子當做B樹的根節點,判斷B樹是否以此節點爲開始是A樹的子結構;同樣的如果A樹有左孩子,類似操作;
③繼續②中的步驟。。。得出最終判斷;
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
boolean ret = false;
if (root1 != null && root2 != null){
//判斷從root1當前結點開始,root2是否爲root1的子樹
if (root1.val == root2.val){
ret = issubTree(root1,root2);
}
//如果不是,則從root1的左節點開始判斷root2是否其子樹
if (!ret){
ret = HasSubtree(root1.left, root2);
}
//如果不是,則從root1的右結點開始判斷root2是否爲其子樹
if (!ret){
ret = HasSubtree(root1.right, root2);
}
}
return ret;
}
public boolean issubTree(TreeNode root1, TreeNode root2){
if (root1!=null && root2==null) return false;
if (root1==null && root2==null) return true;//只有當結點一致才認爲B是A的子結構
if (root1==null && root2!=null) return false;
if (root1.val != root2.val) return false;
return issubTree(root1.left,root2.left) && issubTree(root1.right,root2.right);
}