力扣572. 另一棵树的子树(一入递归深似海)

题目:

给你两棵二叉树 rootsubRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

示例 1:

复制代码
输入:root = [3,4,5,1,2], subRoot = [4,1,2]
输出:true

示例 2:

复制代码
输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]
输出:false

思路:

这道题虽说是简单难度但一点也不简单,递归不太好理解

要判断一个树 subRoot 是不是树 root的子树,那么可以判断 subRoot 是否和树 root的任意子树相等。那么就转化成 相同的树(力扣第100题)

即,这个题的做法就是在 root 的每个子节点上,判断该子节点是否和 subRoot 相等。

判断两个树是否相等的三个条件是与的关系,即:

  1. 当前两个树的根节点值相等;
  2. 并且,root 的左子树和 t 的左子树相等;
  3. 并且,root 的右子树和 t 的右子树相等。

而判断 subRoot 是否为 root 的子树的三个条件是或的关系,即:

  1. 当前两棵树相等;
  2. 或者,subRootroot 的左子树;
  3. 或者,subRootroot 的右子树。

代码及详细分析(and和or逻辑分析):

python 复制代码
# 定义二叉树节点的类
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution:
    def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
        # 判断两棵树是否相同的方法
        def isSame(root, subRoot):
            # 如果两个节点都为空,则返回True
            if not root and not subRoot:
                return True
            # 如果其中一个节点为空,另一个不为空,则返回False
            elif not root or not subRoot:
                return False
            # 比较两个节点的值,并递归地比较它们的左右子树
            return root.val == subRoot.val and isSame(root.left, subRoot.left) and isSame(root.right, subRoot.right)

        # 如果根节点都为空,则返回True
        if not root and not subRoot:
            return True
        # 如果其中一个根节点为空,另一个不为空,则返回False
        elif not root or not subRoot:
            return False
        # 判断当前树是否和子树相同,或者左子树包含子树,或者右子树包含子树
        return isSame(root, subRoot) or self.isSubtree(root.left, subRoot) or self.isSubtree(root.right, subRoot)

当使用 and 运算符时,它会逐个计算表达式的值,如果所有表达式的值都为 True,整个表达式的值才为 True。如果有任何一个表达式的值为 False,整个表达式的值就为 False

在这个特定的代码行中,return root.val == subRoot.val and self.isSame(root.left, subRoot.left) and self.isSame(root.right, subRoot.right),它由三个部分组成,分别是:

  1. root.val == subRoot.val
  2. self.isSame(root.left, subRoot.left)
  3. self.isSame(root.right, subRoot.right)

这三个部分都是逻辑表达式,它们的值要么是 True,要么是 False

整个表达式的含义是:只有当 root 的值等于 subRoot 的值,并且 root 的左子树等于 subRoot 的左子树,并且 root 的右子树等于 subRoot 的右子树时,整个表达式的值才为 True,否则为 False

这里使用 and 运算符是为了确保三个条件都满足,才能判定两棵树是相同的。

当使用 or 运算符时,它会逐个计算表达式的值,如果其中有任何一个表达式的值为 True,整个表达式的值就为 True。只有当所有表达式的值都为 False,整个表达式的值才为 False

在这个特定的代码行中,return self.isSame(root, subRoot) or self.isSubtree(root.left, subRoot) or self.isSubtree(root.right, subRoot),它由三个部分组成,分别是:

  1. self.isSame(root, subRoot)
  2. self.isSubtree(root.left, subRoot)
  3. self.isSubtree(root.right, subRoot)

这三个部分都是逻辑表达式,它们的值要么是 True,要么是 False

整个表达式的含义是:只要其中有一个条件满足,整个表达式的值就为 True。具体来说,如果 rootsubRoot 相同,或者 subRootroot 的左子树的子树,或者 subRootroot 的右子树的子树,整个表达式的值就为 True

这里使用 or 运算符是为了判断当前树是否和子树相同,或者左子树包含子树,或者右子树包含子树,只要有一个条件满足,就说明当前树包含子树。

相关推荐
硅星企鹅1 分钟前
如何使用低代码爬虫工具采集复杂网页数据?
爬虫·python·低代码
客梦1 分钟前
数据结构--哈夫曼编码
数据结构·笔记
山沐与山2 分钟前
【设计模式】Python观察者模式:用RabbitMQ+Celery实现事件驱动
python·观察者模式·设计模式·rabbitmq
爱学大树锯3 分钟前
【23 题(有效的括号序列)】
算法
superman超哥5 分钟前
仓颉协程调度机制深度解析:高并发的秘密武器
c语言·开发语言·c++·python·仓颉
走向IT7 分钟前
Python批量修改linux 密码脚本
linux·运维·服务器·python·批量·修改密码
倔强的小石头_9 分钟前
Python 从入门到实战(十四):Flask 用户认证(给 Web 应用加安全锁,区分管理员与普通用户)
前端·python·flask
sin_hielo10 分钟前
leetcode 3075(排序+贪心)
数据结构·算法·leetcode
wuguan_11 分钟前
C#种更高级的文件处理
算法·c#
兴趣使然黄小黄12 分钟前
【Pytest】使用Allure生成企业级测试报告
python·pytest