572. 另一个树的子树
题面:
给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subtree-of-another-tree
分析:
若一棵树是另一颗树的子树,等价于它和另一颗树的结点完全相等。
编写一个判断是否为相同树的函数,若当前树是相同树,则返回真。若不是,则递归地去从左子树和右子树去寻找。
解法1:暴力递归
class Solution {
public:
bool isSameTree(TreeNode* s, TreeNode* t)
{
if (!s && !t) return true;
if (!s && t || !t && s) return false;
return s->val == t->val &&
isSameTree(s->left, t->left)&&
isSameTree(s->right, t->right);
}
bool isSubtree(TreeNode* s, TreeNode* t) {
if (!s && !t) return true;
if (!(s && t)) return false;
return isSameTree(s, t)||
isSubtree(s->left, t)||
isSubtree(s->right, t);
}
};
时间复杂度 O ( m ∗ n ) O(m*n) O(m∗n),空间复杂度 O ( m a x ( m , n ) ) O(max(m,n)) O(max(m,n))