1.題目:
給定兩個非空二叉樹 s 和 t,檢驗 s 中是否包含和 t 具有相同結構和節點值的子樹。s 的一個子樹包括 s 的一個節點和這個節點的所有子孫。s 也可以看做它自身的一棵子樹
2.題目分析:
前提:S樹不能爲空
(1)返回true;
(2)返回false;
3.程序設計
在S樹找到與T樹根節點值相等的節點,然後以該節點爲根節點產生的樹,判斷與T樹是否相等判斷相同樹(遞歸思想)
4.程序源代碼
//節點類
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Main {
/*1.找到t的根節點在s中的位置
* 2.判斷兩顆二叉樹是否相同
* */
public boolean isSubtree(TreeNode s,TreeNode t){
boolean flag = false;
//遞歸的出口條件
if(s != null){
if(s.val == t.val){
flag = isSameTree(s,t);
}
//此時s還未遍歷完,仍未找到s中爲t的根節點的值的節點
//遞歸的從子樹中尋找
if(!flag){
flag = isSubtree(s.left,t) || isSubtree(s.right,t);
}
}
return flag;
}
//判斷是否是相同樹
public boolean isSameTree(TreeNode p,TreeNode q){
if(p == null && q == null){
return true;
}
if(p == null || q == null){
return false;
}
if(q.val != p.val){
return false;
}
//此時兩棵樹的根節點不爲空且兩棵樹的根節點值相等
//此時去兩棵樹的子樹中去比較
return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
}
}