算法题/数的子结构

来源:互联网 发布:c语言基础书籍推荐 编辑:程序博客网 时间:2024/06/05 20:20

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

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

#coding:utf-8class TreeNode:    def __init__(self,x):        self.val = x        self.left = None        self.right = Noneclass 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 Falseif __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

这里写图片描述

原创粉丝点击