力扣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 运算符是为了判断当前树是否和子树相同,或者左子树包含子树,或者右子树包含子树,只要有一个条件满足,就说明当前树包含子树。

相关推荐
白狐_79816 分钟前
408 数据结构|线索二叉树两题详解:先序线索化后的空链域 + 中序前驱/后继判断
c语言·数据结构·链表
从小就看凹凸曼^o^20 分钟前
Python基础5 - 字典与集合:(1)字典
开发语言·python
GeekZHR28 分钟前
C语言指针进阶补充6:动态内存管理、mem系列内存函数、复杂指针声明,一次补齐指针的“三大盲区“
java·c语言·算法·指针
小赵AI手记35 分钟前
技术拆解(十七)具身智能:机器人动作生成为何走向Diffusion Policy?
人工智能·笔记·python·机器人
.道阻且长.44 分钟前
8.LeetCode算法习题讲解--滑动窗口--长度最小的子数组
算法·leetcode·职场和发展
本地化文档1 小时前
poethepoet-docs-l10n
python·github·gitcode·sphinx
(❁´◡`❁)Jimmy(❁´◡`❁)1 小时前
P1156 [USACO01OPEN] 垃圾陷阱
算法·动态规划
baopixiaoz1 小时前
AI量化策略师|Web3 量化交易研究员
大数据·人工智能·python·区块链
疯狂打码的少年1 小时前
【数据结构】二叉排序树(BST)的定义与操作
数据结构·笔记·算法
lally.1 小时前
整数等差数列超图中的三个非微扰现象
算法