题目
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路
首先判断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):
# write code here
result=False
if pRoot1==None or pRoot2==None:
return False
elif pRoot1!=None and pRoot2!=None:#判断树A中是否有结点和B的根结点一样
if pRoot1.val==pRoot2.val:#若一开始根结点就一样,便判断树的结构是否一样
result = self.DoespRootEqualTopRoot2(pRoot1,pRoot2)
if not result:#若一开始的两棵树的根结点都不一样
result=self.HasSubtree(pRoot1.left,pRoot2)#判断树A的左结点和树B的根结点是否一样
if not result:
result=self.HasSubtree(pRoot1.right,pRoot2)#判断树A的右节点和树B的根结点是否一样
return result
def DoespRootEqualTopRoot2(self,pRoot1,pRoot2):#这个函数的作用是为了判断树A和B的结构是否一样
#这里要注意,判断条件一和判断条件二的顺序不可以调换,因为只有判断到树B为空,
#这才能说明树B的结构和树A的结构都做过了对比,才能说明树B的结构和树A的结构相同。
if pRoot2==None:
return True
elif pRoot1==None:
return False
elif pRoot1.val!=pRoot2.val:
return False
else:
return self.DoespRootEqualTopRoot2(pRoot1.left,pRoot2.left) and self.DoespRootEqualTopRoot2(pRoot1.right,pRoot2.right)