算法题/数的子结构

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

这里要注意的是,题目是判断子结构,而不是判断子树(当然子树也是子结构,但不是所有的子结构都是子树),因此,首先要做的判断应该是从A,B两棵树的根节点开始,这里利用递归的思想(若一对节点相等,则递归的判断这对节点的左右子树是不是分别相等,若一直相等,则总会先遍历完一棵树,若这棵树为B,则B为A的子结构成立,若为A,则A为B的子结构,故不成立),而后再递归的判断B是不是A得左子树或右子树的子结构

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


class Solution:
    #判断连个数是否具有相同的子结构
    def HasSubtree(self,pRoot1,pRoot2):
        if not pRoot1 or not pRoot2:
            return False
        else:
            #从根节点,左子书,右子树比较
            return self.isSubtreefromRoot(pRoot1,pRoot2) or self.HasSubtree(pRoot1.left,pRoot2) or self.HasSubtree(pRoot1.right,pRoot2)

    def isSubtreefromRoot(self,tree1,tree2):
        #如果tree2结束,说明匹配到相应的子结构
        if not tree2:
            return True
        #如果tree1结束,说明没匹配到相应的子结构
        if not tree1:
            return False
        if tree1.val == tree2.val:
            #判断根节点,左子树,右子树是否相同
            return self.isSubtreefromRoot(tree1.left,tree2.left) and self.isSubtreefromRoot(tree1.right,tree2.right)
        else:
            return False

if __name__ == '__main__':
        root = TreeNode(0)
        node1 = TreeNode(1)
        node2 = TreeNode(2)
        node3 = TreeNode(3)
        node4 = TreeNode(4)
        node5 = TreeNode(5)
        node6 = TreeNode(6)
        root.left = node1
        root.right = node2
        root.left.left = node3
        root.left.right = node4
        root.right.left = node5
        root.right.right = node6


        root1 = TreeNode(0)
        node1 = TreeNode(1)
        node2 = TreeNode(2)
        root1.left = node1
        root1.right = node2
        s = Solution()
        print(s.HasSubtree(root,root1))

python find函数

返回b字符串在a字符串的索引开始位置,不存在返回-1

这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值