剑指offer:树的子结构

剑指offer:树的子结构

题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution:
    def HasSubtree(self, pRoot1, pRoot2):
        def helper(root1, root2):
            # 如果root2已经遍历完了,说明root2的每一个节点都能在pRoot1找到对应的节点
            if not root2:
                return True
            # 如果pRoot1遍历完而pRoot2还没遍历完,说明这root1不是对应的子树根节点
            if not root1:
                return False
            # 如果遍历过程中存在值不相等的节点,说明不是要找的子树
            if root1.val != root2.val:
                return False
            # 如果当前节点的值相同,那么继续遍历剩下的节点
            return (helper(root1.left, root2.left)
                    and helper(root1.right, root2.right))

        # 由于题目规定,空树不是子结构,所以特殊处理这种情况
        if not pRoot2 or not pRoot1:
            return False

        res = False
        # 首先找到pRoot1中与pRoot2的根节点的值相同的节点root1,
        # 然后按照与pRoot2相同的顺序去遍历找到的root1,如果以root1为根节点的子树和pRoot2一样
        # 那么说明在pRoot1中找到了跟pRoot2一样的子树。
        if pRoot1.val == pRoot2.val:
            res = helper(pRoot1, pRoot2)
        if not res:
            # 递归遍历pRoot1,直到找到一个子树或者遍历完整棵树
            res = self.HasSubtree(pRoot1.left, pRoot2) \
                  or self.HasSubtree(pRoot1.right, pRoot2)
        return res

转载于:https://blog.51cto.com/jayce1111/2383769

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100958.html原文链接:https://javaforall.net

(0)
上一篇 2021年7月5日 下午5:00
下一篇 2021年7月5日 下午6:00


相关推荐

  • milvus和faiss安装及其使用教程

    milvus和faiss安装及其使用教程

    2026年3月16日
    1
  • ETL数据同步工具Kettle简介

    ETL数据同步工具Kettle简介很多时候,我们需要将一个系统的数据同步到另外一个系统中,两个系统的数据库可能不同,ETL数据同步工具Kettle可能轻松帮我们实现,该功能,而且还可以定时执行数据同步任务。ETL数据同步工具Kettle使用Kettle简介:Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,数据抽取高效稳定。Kettle中文名称叫水壶,该项目的主程序

    2022年6月28日
    48
  • JavaScript面向对象思想

    JavaScript面向对象思想javascript中的面向对象:ECMA标准定义JS中的对象:无序属性的集合,其属性可以包含基本值、对象或者函数。可以简单理解为JS的对象是一组无序的值,其中的属性或方法都有一个名字,根据这个名字可以访问相映射的值(值可以是基本值/对象/方法)面向对象三个基本特征是:封装、继承、多态封装:将对象运行所需的资源封装在程序对象中,基本上是方法和数据。对象是“公布其接口”。其他附加到这些接口上的对象不需要关心对象实现的方法即可使用这个对象。这个概念就是“不要告诉我你是怎么做的,只要做就可以了。”对象可

    2025年6月17日
    5
  • U盘 未知USB设备 设定地址失败 由于该设备有问题Windows 已将其停止(代码 43) 终极解决方案(做过系统装机盘而无法解决的必看)

    U盘 未知USB设备 设定地址失败 由于该设备有问题Windows 已将其停止(代码 43) 终极解决方案(做过系统装机盘而无法解决的必看)U盘由于该设备有问题Windows已将其停止(代码43)终极解决方案我们在使用U盘的时候偶尔会碰到下列情况一般是因为传输数据的过程中,死机或未响应直接断点或拔掉设备导致的,U盘再次插上之后出现设定地址失败。无法再次读取设备的数据。解决方案:首先请确认出现该情况不是因为你摔了U盘或接口处产生断裂这种物理损伤导致的!!!首先请确认出现该情况不是因为你摔了U盘或接口处产生断裂这种物理损…

    2022年6月28日
    330
  • 汉语拼音发音教学视频_钢琴手把手教学视频

    汉语拼音发音教学视频_钢琴手把手教学视频pycharm汉化pycharm怎么改成汉语,手把手教学,超详细(汉语插件安装教程)首先,打开pycharm。然后点击左上角File(文件)会弹出如下页面继续点击蓝色位置Settings…(设置)会弹出一个页面如下:继续点击蓝色位置Plugins(插件)在搜索栏中输入chinese,如图然后安装第二个(可以滑动找一下),点击Install(安装),会加载一下下载进度条,然后变成这样:安装之后点击绿色按钮RestartIDE,会弹出点击蓝色按钮Restart,然后pycharm会重启,重启后

    2022年8月26日
    6
  • bat 注释

    bat 注释行注释 remrem 注释内容打开回显 注释内容会输出 注释内容打开回显 注释内容不会输出 ps 建议使用 rem 注释描述内容 使用 注释代码内容 块注释 gotostart 被注释的代码块 start 利用 goto 和 跳转命令实现 上面的 start 标签名是可以随便自定义的

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号