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.因为判断是否为子根,因此只要在左右根里有一处子根和所给的根相同即可,所以在最后的递归处应该是或,而不是且。

  • 17
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值