# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
if p is None and q is None:
return True
if p is None or q is None:
return False
if 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)
# 辅助函数:判断两棵二叉树是否完全相同(结构和节点值都一样)
def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
"""
递归地检查两棵树 p 和 q 是否完全相同。
"""
# 1. 基线条件:如果两个节点都为空,则认为它们在此处是相同的。
if p is None and q is None:
return True
# 2. 基线条件:如果只有一个节点为空,另一个不为空,则结构不同,它们不相同。
if p is None or q is None:
return False
# 3. 值比较:如果两个节点的值不同,则它们不相同。
if p.val != q.val:
return False
# 4. 递归步骤:当前节点相同,继续递归比较左子树和右子树。
# 必须左子树相同 **并且** 右子树也相同,才认为两棵树相同。
return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)
# 主函数:判断 subRoot 是否是 root 的子树
def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
"""
检查树 subRoot 是否是树 root 的一个子树。
子树意味着在 root 中存在一个节点 node,使得以 node 为根的子树与 subRoot 完全相同。
"""
# 1. 基线条件:如果 subRoot 为空树 (None)。
# 按照定义,空树是任何树的子树。
if not subRoot: # 等价于 if subRoot is None:
return True
# 2. 基线条件:如果 subRoot 不为空,但 root 为空树 (None)。
# 非空树不可能是空树的子树。
if not root: # 等价于 if root is None:
return False
# 3. 检查当前节点:判断以当前 root 节点为根的子树是否与 subRoot 完全相同。
# 如果相同,我们找到了匹配,subRoot 是 root 的子树。
if self.isSameTree(root, subRoot):
return True
# 4. 递归搜索子节点:
# 如果以当前 root 为根的树与 subRoot 不同,那么我们需要继续在 root 的子树中寻找。
# 递归调用 isSubtree,检查 subRoot 是否是 root 的左子树的子树,
# 或者 (or) subRoot 是否是 root 的右子树的子树。
# 只要在左边或右边任何一个分支中找到了匹配,就返回 True。
return self.isSubtree(root.left, subRoot) or self.isSubtree(root.right, subRoot)
572. 另一棵树的子树
于 2025-04-08 23:35:36 首次发布