【剑指offer-C++】JZ26:树的子结构

该文章讨论了如何判断一棵二叉树B是否是另一棵二叉树A的子结构。通过递归的方法,定义了isSame函数来检查B是否与A的某个子树相同,然后在HasSubtree函数中遍历A的每个节点,寻找是否存在匹配的子树。如果找到匹配的子树,则返回true,否则返回false。
摘要由CSDN通过智能技术生成

【剑指offer-C++】JZ26:树的子结构

题目描述

描述:输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构)
假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构。

在这里插入图片描述

数据范围:0 <= A的节点个数 <= 10000,0 <= B的节点个数 <= 10000。

输入:{8,8,7,9,2,#,#,#,#,4,7},{8,9,2}
返回值:true
输入:{1,2,3,4,5},{2,4}
返回值:true
输入:{1,2,3},{3,1}
返回值:false

解题思路

树的子结构:最直观的想法是,使用双指针,一个指针指向A,一个指针指向B,首先遍历树A,然后针对树A的当前结点,判断B是否是以当前结点为根的子树的子结构。

//判断B是否是和以A为根的子树匹配
bool isSame(TreeNode *pRoot1,TreeNode *pRoot2)
{
    //递归出口是如果pRoot2为空则为真
    if(!pRoot2)
      return true;
    //反之如果pRoot2不为空但是pRoot1为空则为假
    else if(!pRoot1)
      return false;
    //B和以A为根的子树匹配所需要满足的条件即为:B和A当前节点相等且B的左与A的左匹配且B的右和A的右匹配
    return pRoot1->val==pRoot2->val&&isSame(pRoot1->left,pRoot2->left)&&isSame(pRoot1->right,pRoot2->right);
}
//判断树B是否是树A的子结构 其中是B是整个树A的子结构 并不一定是以A为根节点的 即A的根节点与B的根节点相等的匹配
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) 
{
    //递归出口即为A或者B为空树则为false
    if(!pRoot1||!pRoot2)
       return false;
    //B是A的子结构所需要满足的条件即为:B是以A为根节点的子树或者B是A的左孩子树的子结构或者B是A的右孩子的子结构
    return isSame(pRoot1,pRoot2)||HasSubtree(pRoot1->left,pRoot2)||HasSubtree(pRoot1->right,pRoot2);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值