572. 另一棵树的子树

# 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)

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值