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

题目:

给你两棵二叉树 root 和 subRoot 。检验 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. 或者,subRoot  是 root 的左子树;
  3. 或者,subRoot 是 root 的右子树。

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

# 定义二叉树节点的类
# 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。具体来说,如果 root 和 subRoot 相同,或者 subRoot 是 root 的左子树的子树,或者 subRoot 是 root 的右子树的子树,整个表达式的值就为 True

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

相关推荐

  1. 572.

    2023-12-07 10:58:01       38 阅读
  2. Leetcode 572

    2023-12-07 10:58:01       22 阅读
  3. leetcode 572.

    2023-12-07 10:58:01       46 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 10:58:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 10:58:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 10:58:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 10:58:01       18 阅读

热门阅读

  1. CasADi - 最优控制开源 Python/MATLAB 库

    2023-12-07 10:58:01       33 阅读
  2. 如何在Ubuntu上安装pip3

    2023-12-07 10:58:01       45 阅读
  3. 嵌入式Web设计与W5500的应用

    2023-12-07 10:58:01       35 阅读
  4. MATLAB: 调整坐标轴范围

    2023-12-07 10:58:01       44 阅读
  5. 大屏适配方案(vw、vh)

    2023-12-07 10:58:01       32 阅读
  6. 字符个数统计

    2023-12-07 10:58:01       34 阅读
  7. stm32 RTC时钟设置能不能用毫秒

    2023-12-07 10:58:01       38 阅读