递归
判断是否是子树需要分为两个步骤:
一、判断是否是子树
对每个s的节点si,有三种情况,其中一种情况成立则返回true
- 以si为根节点的子树 = t树
- 以si的左子树为根节点的子树 = t树
- 以si的右子树为根节点的子树 = t树
二、判断两个树是否相等
这个判断可以参考leetcode 101. 判断镜像树的步骤:
- 两边都不存在 true
- 一边不存在,一边存在 false
- 值不相等 false
- 值相等 判断左右子树是否相等
class Solution
{
public:
bool isSubtree(TreeNode *s, TreeNode *t)
{
if (!s || !t)
return false;
return helper(s, t) || isSubtree(s->left, t) || isSubtree(s->right, t);
}
bool helper(TreeNode *s, TreeNode *t)
{
if (!s && !t)
return true;
if ((!s && t) || (s && !t))
return false;
if (s->val == t->val)
return helper(s->left, t->left) && helper(s->right, t->right);
return false;
}
};