剑指 Offer 26. 树的子结构(判断是否为一个数的子树)

剑指 Offer 26. 树的子结构

判断b树是否为a树的子树,首先需要先应用一个先序遍历来寻找与b树根结点相同的a树的子结点,之后再进行递归判断每一侧是否相同。

该题难点在于递归,掌握以后应该关于树的子结构题可以通杀。

Picture1.png

 图片转自:力扣

先进性先序遍历(直接利用原题的函数进行遍历就可以),在遍历的时候添加上条件即可(利用python特性可以实现一行判断)。

递归永远先写终止递归进行回溯的条件,该题终止递归的条件为b树无根结点(即B为空)

因为要判断b树的根结点是否与a树的当前节点相同所以在定义recur函数时需要判断ab当前节点是否相等,不等直接return false并且要or一个a树为空,a树为空因为上面先进性判断b树为空,a树为空则也直接返回false

在函数内递归只需要recur两个树的左右结点,之间使用and。

return bool(A and B) and (recur(A,B) or self.isSubStructure(A.left,B) or self.isSubStructure(A.right,B)) 

这一行为精髓,布尔值判断ab是否为空,有一个为空就返回假,之后and一下函数对两个结点

,然后or进行递归,分别a.left,b,a.right,b。(其实就是先序遍历,or对递归满足其一即可。)

class Solution:
    def isSubStructure(self, A: TreeNode, B: TreeNode) -> bool:
        def recur(A,B):
            if not B :return True
            if not A or A.val !=B.val:
                return False
            return recur(A.left,B.left) and recur(A.right,B.right)
        return bool(A and B) and (recur(A,B) or self.isSubStructure(A.left,B) or self.isSubStructure(A.right,B))

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值