剑指offer(5)数的子结构--python

题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)。

读题,首先,这是一道二叉树的题,那基本上就和递归、指针有关了,虽然python里并没有指针的概念,但是在做编程题的时候,要领会指针的思想。
先回顾一下二叉树的定义:

# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

如何判断B树是不是A树的子结构,既然是子结构,那就是每个节点对应相等,那首先,得在A树中找到一个和B树的根节点相等的节点吧。
这就是第一步,先递归遍历二叉树A,找A中和B的根节点相等的节点。
二叉树的遍历通常都是递归遍历,左右两个方向进行递归,而递归边界就是判断传进来的这个节点是不是空节点。

    def HasSubtree(self, pRoot1, pRoot2):
        # write code here
        result = False
        if not pRoot1:
            return 
        if not pRoot2:
            return
        if pRoot1.val == pRoot2.val:
            result = self.DoesTree1HaveTree2(pRoot1,pRoot2)
            #可以看到,如果result不是true,就是这个节点下的结构不是子树时,会继续递归遍历
        if not result:
            result = self.HasSubtree(pRoot1.left,pRoot2)
        if not result:
            result = self.HasSubtree(pRoot1.right,pRoot2)
        return result

然后,顺着这个相等的节点,我们可以进行第二步了。这时另写一个函数,作为判断这个相等节点下的结构是不是就和B树相同。

    def DoesTree1HaveTree2(self,pRoot1,pRoot2):
        if pRoot2 == None:#B树结束了,A树还没完,那肯定是包含
            return True
        if pRoot1 == None:#A树结束了,B树还没完,那肯定不包含了
            return False
        if pRoot1.val != pRoot2.val:#两个树对应点的值不相等,不用继续了,不包含
            return False
            #经历过上面的筛选后,这个节点通过了考验,
            #继续向下,判断各自的左右子节点是否一样
            #用递归方法可以直接写出
        return self.DoesTree1HaveTree2(pRoot1.left,pRoot2.left) and self.DoesTree1HaveTree2(pRoot1.right,pRoot2.right)

最后完整代码如下:

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    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)
    def HasSubtree(self, pRoot1, pRoot2):
        # write code here
        result = False
        if not pRoot1:
            return 
        if not pRoot2:
            return
        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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值