剑指offer:树的子结构

发布时间:2020-07-20 23:09:29 作者:Jayce_SYSU
来源:网络 阅读:509

题目描述
输入两棵二叉树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
推荐阅读:
  1. 剑指offer:丑数
  2. 剑指offer:礼物的最大价值

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

结构 树的

上一篇:HTML5 history新特性pushState、repl

下一篇:Android学习——ViewPage实现多页面滑动效果

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》