输入两棵二叉树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