题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。
我们规定空树不是任何树的子结构。
样例
树A:
树B:
返回 true ,因为B是A的子结构。
思路
1、由于对于一棵树的描述是给出其根节点,所以判断一棵树是否为另外一棵树的子树,首先就是判断两树的根节点是否一致。在对比过程中,如果发现A树的根节点和B树的根节点不一致,则需要找到A根节点的子孙节点接着与B的根节点进行比较,这里就想到利用递归遍历一棵树的所有节点。这里需要遍历的是A的所有节点
2、对于找到根节点相同的情况,则需要判断两棵树是否有相同的结构,这里就需要同时利用递归判断两棵树的所有节点是否相同(在同为根节点或左孩子或右孩子时)
3、综上所述,解出此题需要构造两个递归函数,一个递归函数实现对A与B和A的子树与B进行比较,另一个函数实现两树是否具有相同的结构
代码实现
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def hasSubtree(self, pRoot1, pRoot2):
"""
:type pRoot1: TreeNode
:type pRoot2: TreeNode
:rtype: bool
"""
if pRoot1 == None or pRoot2 == None:
return False
if self.isPart(pRoot1, pRoot2): # 树的结构是否相同
return True
else: # 递归实现子树与B的比较
return self.hasSubtree(pRoot1.left, pRoot2) or self.hasSubtree(pRoot1.right, pRoot2)
def isPart(self, root1, root2):
if root2 is None:
return True
if root1 is None:
return False
if root1.val == root2.val: # 若根节点相同则继续判断子节点是否也相同 # 递归实现
return self.isPart(root1.left, root2.left) and self.isPart(root1.right, root2.right)
else:
return False