题目描述:
- 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
算法1:
- 使用先序遍历生成两棵树的序列,之后只需要判断序列是否存在即可。
class Solution:
def pretravel(self, proot, list):
if proot is None:
return
list.append(proot.val)
self.pretravel(proot.left, list)
self.pretravel(proot.right, list)
def HasSubtree(self, pRoot1, pRoot2):
list1 = []
list2 = []
self.pretravel(pRoot1, list1)
self.pretravel(pRoot2, list2)
if len(list1) == 0 or len(list2) == 0:
return False
for i in range(len(list1) - len(list2) + 1):
if list1[i:len(list2) + i] == list2:
return True
return False
算法2:
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def SearchSimiler(self, p1, p2):
if p2 is None:
return True
if p1 is None:
return p1 == p2
flag = False
if p1.val == p2.val:
flag = self.SearchSimiler(p1.left, p2.left) and self.SearchSimiler(p1.right, p2.right)
return flag or self.SearchSimiler(p1.left, p2) or self.SearchSimiler(p1.right, p2)
def HasSubtree(self, pRoot1, pRoot2):
"""
:param pRoot1: TreeNode
:param pRoot2: TreeNode
:return:
"""
if pRoot1 is None or pRoot2 is None:
return False
return self.SearchSimiler(pRoot1, pRoot2)