leetcode——另一个树的子树

Posted 峰晓

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode——另一个树的子树相关的知识,希望对你有一定的参考价值。

在这里插入图片描述
对于该问题,判断一个数是否为另一个树的子树,最好的方法就是我们根据树的顺序,依次和所给的数进行比较,也就是说将这个树拆分成若干个子树,依次和所给的树进行比较,如果存在相同的树,则所给的树是该树的子树。
在这里我们需要调用的是判断两个树是否相等的函数。具体比较过程如图所示:
在这里插入图片描述
如图所示,先是所给的树与该树整体进行比较,如果不相等,则将该树分为左右两个子树,再依次进行比较
在这里插入图片描述
如图,该树分为左右子树,通过比较,所给的树与左子树相等,因此所给的树是该树的子树
该示例所给的数据较少,若是整个树比较庞大,则将子树再分别分为左右子树,依次比较,直到遍历完整个树或者确定有相等的子树为止。

bool _chekSame(struct TreeNode* pre,struct TreeNode* ret)
{
    if(pre==NULL&&ret==NULL)
    {
        return true;
    }
    if(pre==NULL||ret==NULL)
    {
        return false;
    }
    if(pre->val!=ret->val)
    {
        return false;
    }
    else
    {
        return  _chekSame(pre->left,ret->left)&&
        _chekSame(pre->right,ret->right);
    }
}

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
if(root==NULL)
{
    return false;
}
if(_chekSame(root,subRoot))//先判断所给的子树是否与该树整体都相等
{
    return true;
}
else
{
return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}
}

总结:
1.虽然题干中说的是两个树都为非空,但是在函数中开始时仍然需要考虑为空的情况,因为下面需要进行递归,root就不再表示开始时的根了,当遍历完之后,root指向的是空节点,此时要停止程序并返回false
2.因为判断是否为子根,因此只要在左右根里有一处子根和所给的根相同即可,所以在最后的递归处应该是或,而不是且。

以上是关于leetcode——另一个树的子树的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode572另一个树的子树

LeetCode 572. 另一个树的子树(Subtree of Another Tree) 40

leetcode572.另一个树的子树

leetcode572.另一个树的子树

572. 另一个树的子树

LeetCode 572. Subtree of Another Tree (是否是另一个树的子树)