問題描述:
給定兩個非空二叉樹 s 和 t,檢驗 s 中是否包含和 t 具有相同結構和節點值的子樹。s 的一個子樹包括 s 的一個節點和這個節點的所有子孫。s 也可以看做它自身的一棵子樹。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/subtree-of-another-tree
示例 1:
給定的樹 s:
3
/ \
4 5
/ \
1 2
給定的樹 t:
4
/ \
1 2
返回 true,因爲 t 與 s 的一個子樹擁有相同的結構和節點值。
示例 2:
給定的樹 s:
3
/ \
4 5
/ \
1 2
/
0
給定的樹 t:
4
/ \
1 2
返回 false
解題思路:
看到樹,首先想到遞歸
這裏是判斷t是否爲s的子樹,就是判斷s中以每個節點爲根的樹是否於t相同,裏面必定包含一個判斷倆樹相等的函數:
如下:
bool isSame(TreeNode* s, TreeNode* t){
if(s==NULL && t==NULL){
return true;
}
else if(s && t){
if(s->val == t->val){
return isSame(s->left,t->left)&&isSame(s->right,t->right);
}else{
return false;
}
}
return false;
}
下面在依次判斷s中每個節點,完整代碼如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSubtree(TreeNode* s, TreeNode* t) {
if(s==NULL && t!=NULL) return false;
if(isSame(s,t)) return true;
bool f1;
bool f2;
f1 = isSubtree(s->left,t);
f2 = isSubtree(s->right,t);
return f1||f2;
}
bool isSame(TreeNode* s, TreeNode* t){
if(s==NULL && t==NULL){
return true;
}
else if(s && t){
if(s->val == t->val){
return isSame(s->left,t->left)&&isSame(s->right,t->right);
}else{
return false;
}
}
return false;
}
};