日野弥生:勉強しよう

LeetCode 572 - 另一棵树的子树

发表于2025年03月10日

#树 #二叉树 #深度优先搜索 #字符串匹配 #哈希函数

递归解题,类似于判断集合是否是子集,把两数是否相同的递归函数写出来,然后判断子树要对根节点的值是否相等进行分类讨论即可。

class Solution:
    def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
        if (not p and q) or (not q and p):
            return False
        if (p and q and p.val != q.val):
            return False
        if not p and not q:
            return True
        left = self.isSameTree(p.left if p.left else None, q.left if q.left else None)
        right = self.isSameTree(p.right if p.right else None, q.right if q.right else None)
        return left and right
    def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
        # 都为空的时候,空树是空树的子树
        if not root and not subRoot:
            return True
        # 主树为空则失败
        elif not root and subRoot:
            return False
        # 按照题干要求,如果子树不包含主树的所有子节点也不符合要求
        elif root and not subRoot:
            return False
        # 根节点不符合则递归找左右子树
        if root.val != subRoot.val:
            return self.isSubtree(root.left, subRoot) or self.isSubtree(root.right, subRoot)
        else:
            # 根节点相同,则判断子树是否完全相同,或者递归子树进行判断
            return (self.isSameTree(root.left, subRoot.left) and self.isSameTree(root.right, subRoot.right)) or (self.isSubtree(root.left, subRoot) or self.isSubtree(root.right, subRoot))

改进后的代码如下:

class Solution:
    def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
        if not p and not q:
            return True
        if not p or not q or p.val != q.val:
            return False
        return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)

    def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
        if not subRoot:
            return True
        if not root:
            return False
        if self.isSameTree(root, subRoot):
            return True
        return self.isSubtree(root.left, subRoot) or self.isSubtree(root.right, subRoot)

フラッシュタブ:LeetCode

题目链接:https://leetcode.cn/problems/subtree-of-another-tree/

上一篇

LeetCode 404 - 左叶子之和

下一篇

LeetCode 572 - 二叉树的层平均值