题解 | #树的子结构#

树的子结构

http://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88

题目难度:较难
考察知识:树,递归
题目大意:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

1.问题分析
首先考虑如何判断B是A的子结构,在A的遍历过程中出现了B即说明B是A的子结构,需要注意题目说明了空树不是任意一棵树的子结构,先不考虑空树,想要确实B是否是A的子结构应该如何判断,当A的某子树treeA的value和B的value相同并且和的左右子树也是treeA的左右子树的子结构,这时可以判断B是A的子结构,否则判断B是否是A的左右子树的子结构,如图
图片说明
具体做法为
图片说明
算法设计
从上面的分析可以发现,涉及了很多调用子树的情况,所以使用递归可以很方便的处理子树问题
但是要注意的是题目限制了空树不是任意树的子结构!!!
需要特判B是否为空,否则会发生错误,原因是上述判断B是A的子结构的递归终止条件是B的子树为空
所以不加判断一定会得到错误答案
下面给出代码

class Solution {
public:
    int f=0;//特判
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
        if(!f)
        {
            f=1;
            //将f变为1,这是为了递归时不需要特判
            if(pRoot2==nullptr)return 0;
            //如果B是空直接返回false
        }
        if(pRoot1==nullptr&&pRoot2==nullptr)return 1;
        //ab同时为空说明也可能存在子结构关系,所以要放到最前面判断
        if(pRoot1==nullptr)return 0;
        //a为空说明a遍历完了也没找到b
        if(pRoot2==nullptr)return 1;
        //b子树为空说明子树是a的子结构
       if(pRoot1->val==pRoot2->val&&HasSubtree(pRoot1->left,pRoot2->left)&&HasSubtree(pRoot1->right, pRoot2->right))
           return 1;//如果当前value相同并且左右子树也相同,说明已经存在了子结构关系,返回1
            if(HasSubtree(pRoot1->left,pRoot2))return 1;//b是a左子树的子结构,返回1
            if(HasSubtree(pRoot1->right, pRoot2))return 1;//b是a右子树的子结构,返回1
            return 0;//都不是返回0
    }
};

可以发现,关于树的题大多可以递归处理,并且思路清晰,代码简洁,但递归本身并不是很好理解,并且要考虑清楚递归的终止条件是什么

全部评论

相关推荐

头像
04-27 15:11
已编辑
华东师范大学 算法工程师
暑期实习从2月开始投,面了两个月,流程该挂的都挂完了,腾讯字节一共号称是1.7w个hc,不知道都发给谁了,估计今年秋招要难顶。Timeline米哈游、美团、蚂蚁、微软等公司直接简历挂穿,没进面。携程:3.3 投递、测评3.12 笔试3.18 一面3.25 二面4.13 ai面(hr面)4.14 英语测评4.23 offer(已拒)腾讯:2.6 测评2.28 wxg一面3.5 wxg二面(挂)3.11 teg一面3.21 teg二面(取消)3.31 teg一面4.10 teg二面(挂)4.21 wxg一面4.24 wxg二面(挂)字节:1.28 aml约面(取消)3.17 火山一面(挂)4.8 aml一面(挂)4.20 抖音data一面(挂)阿里:3.23 投递、测评3.28 笔试3.31 淘天一面4.8 钉钉一面4.9 淘天二面4.10 阿里控股一面4.12 钉钉二面(取消)4.15 淘天hr面4.16 淘天offer(已接)4.21 高德一面(取消)4.22 淘宝闪购一面(取消)面试最大的感触是,现在撞上ai转型,一堆老业务急着转向,新业务非常不成熟,研究型的组bar非常高根本进不去,业务侧挂着算法的岗位干的都是工程活,面试却又要问算法,另外agent的落地也远没有那么广,绝大多数还是那套写死的系统调一下llm api或者做做rag,其余少部分真的在搭agent的,基本不能在线上服务用什么很智能的模型,现阶段成本太高,进去大概率就是给垃圾模型从工程方面兜底,除了业务场景的应用和数据经验以外,技术方面很难有什么提升。算法岗做不了基模的还是去搜广推好,之前判断失误了完全没投,秋招不知道还进不进得去。
嵌入式的小白:不错啊,淘天也是挺好的,恭喜
我的求职进度条
点赞 评论 收藏
分享
05-15 14:58
已编辑
南昌航空大学科技学院 C++
mcart:上海150怎么活,睡公司吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务