题目
给定两个非空二叉树 s 和 t,检验s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。
题目链接
示例
给定的树s:
3
/ \
4 5
/ \
1 2
给定的树t:
4
/ \
1 2
返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。
题目分析
如果s
与t
有且只有一树是空的,那么t
不可能是s
的子树。
if (s == NULL && t == NULL) return true;
if (s == NULL || t == NULL) return false;
如果t
是s
的子树,有以下三种情况
s = t
-
t
是s
的左子树的子树 -
t
是s
的右子树的子树
以上三种情况成立一种即为真。
return isSametree(s, t) || isSubtree(s->left, t) || isSubtree(s->right, t);
如果s = t
,必须同时满足以下三个条件
s->val == t->val
s->left = t->left
s->right = t->right
if (s->val == t->val){
return isSametree(s->left, t->left) && isSametree(s->right, t->right);
}
else return flase;
题目解答
class Solution {
public:
bool isSametree(TreeNode* s, TreeNode* t){
if (s == NULL && t == NULL) return true;
if (s == NULL || t == NULL) return false;
if (s->val == t->val){
return isSametree(s->left, t->left) && isSametree(s->right, t->right);
}
else return false;
}
bool isSubtree(TreeNode* s, TreeNode* t) {
if (s == NULL && t == NULL) return true;
if (s == NULL || t == NULL) return false;
return isSametree(s, t) || isSubtree(s->left, t) || isSubtree(s->right, t);
}
};