leetcode 剑指 Offer 26. 树的子结构 python

题目描述:

题解一:未通过

这道题可以使用递归的方法解决:

1.递归终止条件:如果输入A或B为空子树,return false。

2.递归返回值:当前A节点是否包含和B相同结构的子树。

3.当前递归:

<1>判断A.val是否等于B.val,如果相等,分别判断A B左右子树是否相等(需要考虑B子树是否为空)

<2>如果A.val!=B.val,分别将A左右子树与B比较。

class Solution(object):
    def isSubStructure(self, A, B):
        if A==None or B==None:
            return False
        if A.val==B.val:
            if B.left!=None and B.right!=None:
                return self.isSubStructure(A.left,B.left) and self.isSubStructure(A.right,B.right)
            elif B.left!=None:
                return self.isSubStructure(A.left,B.left)
            elif B.right!=None:
                return self.isSubStructure(A.right,B.right)
            elif B.left==None and B.right==None:
                return True
        else:
            return self.isSubStructure(A.left,B) or self.isSubStructure(A.right,B)

倒数第三个测试用例失败,因为A中可能存在多个和B val相等的节点,匹配的子树位于后面匹配的节点。

 题解二:通过

1.dfs(A,B)函数,如果A为空,返回False,如果B为空,返回True(此时的B为题目中输入B的子树,与题目要求空子树不是任何树的子树不冲突)。如果A B节点值相同,且左右子树都匹配则返回True。

2.isSubStructure:如果A或B为空,返回False,否则return self.dfs(A,B) or self.isSubStructure(A.left,B) or self.isSubStructure(A.right,B)

注意:dfs中必须先判断B是否为空,如果为空返回True。

class Solution(object):
    def isSubStructure(self, A, B):
        if A==None or B==None:
            return False
        return self.dfs(A,B) or self.isSubStructure(A.left,B) or self.isSubStructure(A.right,B)
    def dfs(self,A,B):
        if B==None:
            return True
        if A==None:
            return False
        return A.val==B.val and self.dfs(A.left, B.left) and self.dfs(A.right,B.right)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值