剑指offer-树的子结构

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
输入:{8,8,#,9,#,2,#,5},{8,9,#,2}
输出:true

思路一: 对于两棵二叉树来说,要判断B是不是A的子结构 ,首先先找到数A中和树B值一样的节点。找到了这一节点之后再分别判断两个左子节点是否相等和两个右子节点是否相等。

  • 首先,我们先查找到这个相等的节点,采用递归的方法来遍历整棵树
  • 找到这个节点之后,第二步我们用另一个递归来分别比较左子节点和右子节点。
class Solution:
    def HasSubtree(self, pRoot1, pRoot2):
        # write code here
        result = False
        if pRoot1!=None and pRoot2!=None:
            if pRoot1.val == pRoot2.val:
                result =self.DoesTree1haveTree2(pRoot1,pRoot2)
            if not result:
                result = self.HasSubtree(pRoot1.left, pRoot2)
            if not result:
                result = self.HasSubtree(pRoot1.right, pRoot2)
        return result
    def DoesTree1haveTree2(self, pRoot1, pRoot2):
        if pRoot2 == None:
            return True
        if pRoot1 == None:
            return False
        if pRoot1.val !=pRoot2.val:
            return False
        return self.DoesTree1haveTree2(pRoot1.left,pRoot2.left) and self.DoesTree1haveTree2(pRoot1.right,pRoot2.right)

注: DoesTree1haveTree2里的两个if切记不能颠倒顺序,因为如果先判断pRoot1若等于None,直接返回False,但是进入这个方法的前提条件是pRoot1.val == pRoot2.val,则pRoot2=None,判错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值