题目
分析
我比较能看懂的是官方给的深度优先暴力解法,就是枚举root的每个结点,如果和subRoot相等,便用两个指针同时遍历这两个子树,如果相同就是TRUE呗。
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution
{
public:
bool check(TreeNode *o, TreeNode *t) //先检查两个树
{
if (!o && !t) //其中任何一个为空则满足条件。
{
return true;
}
if ((o && !t) || (!o && t) || (o->val != t->val))
{
return false;
}
return check(o->left, t->left) && check(o->right, t->right);
}
bool dfs(TreeNode *o, TreeNode *t) //深度优先遍历函数
{
if (!o)
{
return false;
}
return check(o, t) || dfs(o->left, t) || dfs(o->right, t);
}
bool isSubtree(TreeNode *s, TreeNode *t)
{
return dfs(s, t); //遍历结果正误便是答案。
}
};
测评结果
小结
暴力解法相对简单一点,容易理解。