剑指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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • VC++分别使用WinExec、CreateProcess、ShellExecute和ShellExecuteEx来启动程序(附源码)

    VC++分别使用WinExec、CreateProcess、ShellExecute和ShellExecuteEx来启动程序(附源码)本文详细讲述使用调用WinExec、CreateProcess、ShellExecute和ShellExecuteEx多个API函数来实现程序启动的方法。

    2022年7月11日
    21
  • pycharm快速替换_pycharm代码追踪

    pycharm快速替换_pycharm代码追踪1.在ios中用commend+shift+R打开菜单windons系统可以试试將commend替换为control会出现这样的界面(如果你有提前选中单词的话,系统将默认被选中的单词是將被替换的单词(可以更改))2.在第二行输入需要保留的语句,然后按下回车即可替换我们会发现标记的地方发生了替换注:一定要注意自己要替换的是那些部分(那些文件(它是可以替换别的文件的语句的))!!!!千万不要替换错了(多了),很难改…

    2022年8月28日
    7
  • 如何免费下载付费音乐歌曲,6个网站+8个APP

    如何免费下载付费音乐歌曲,6个网站+8个APP现在听音乐的软件,QQ音乐,酷狗,网易云等,很多歌曲可以在线听。但是下载某些歌曲或者在线听高品质无损的都需要付费。这一期,给大家推荐的是免费下载付费歌曲工具,包括网站跟APP。网站篇1.VIP

    2022年7月1日
    69
  • FC游戏 《三国志2-霸王的大陆》攻略「建议收藏」

    FC游戏 《三国志2-霸王的大陆》攻略「建议收藏」《三国志2-霸王的大陆》是日本南梦宫公司研发的一款历史战略模拟游戏,于1992年06月10日在红白机平台上发行。在开始游戏选择君主时(一定要在君主未出现前的画面时进行第二步),按住1P的START不要放,按住START同时,连续依次按上,下,左,右,按满3次,听到“乒”一下的声音后再开始游戏,这时再选君主:君主城金钱、兵马、宝等全满。一、武将1)武将出场时间189年-190…

    2025年8月19日
    3
  • Linux网络下载管理工具(lftp, ftp, lftpget, wget)「建议收藏」

    Linux网络下载管理工具(lftp, ftp, lftpget, wget)「建议收藏」网络客户端管理工具在Linux中,通常用网络客户端管理工具实现文件的下载与上传,主要有以下几种,分别为lftp工具,ftp工具,lftpget工具,wget工具,在centos7中,要尽量学会lftp,lftpget等工具,下面多这些工具的简单使用逐一介。lftp使用命令manlftp可查看其具体的使用方法,如果lftp工具未安装,使用yuminstalllftp命令进…

    2022年5月29日
    41
  • Eclipse卸载插件「建议收藏」

    Eclipse卸载插件###本人Eclipse版本为:EclipseMars1.选择:Help->InstallNewSoftware,如下图:2.点击whatisalreadyinstalled?如下图:3.点击已经安装的插件,然后选择uninstall就可以了。转载于:https://www.cnblogs.com/cyttina/…

    2022年4月7日
    37

发表回复

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

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