题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构
思路
1、需要设置一个标志位来代表本算法的出口
2、首先判断A和B的根节点是否相同,如果不同,则转入A的左子树进行判断,判断B是否包含在A的左子树中,如果不在。则转入右子树进行寻找。
3、当B遍历完为空时:若A也同时为空或者不为空时,则说明匹配
4、当B不为空,而A为空时,则说明A不包含B
具体实现如下代码:
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def HasSubtree(self, pRoot1, pRoot2):
#判断如果树A或者B是否为空,如果为空则返回False。
#注:在python中 None, False, 空字符串”“, 0, 空列表[], 空字典{}, 空元组()都相当于False
if not pRoot1 or not pRoot2:
return False
flag = False
#如果当前判断的根节点元素相等,则继续递归判断两棵树的子节点是否相等
if pRoot1.val == pRoot2.val:
flag = self.judge(pRoot1,pRoot2)
#如果上一部判断之后,当前判断节点不相等,则进入树A的左子树或者右子树
if not flag:
flag = self.HasSubtree(pRoot1.left,pRoot2) or self.HasSubtree(pRoot1.right,pRoot2)
return flag
def judge(self,pRoot1,pRoot2):
#如果此时树B已经递归完了,则说明B是A的子结构
if pRoot2 ==None:
return True
#如果此时树A递归完了,而B树没有递归完,则说明B不是A的子结构
elif not pRoot1:
return False
#如果都没有递归完,则判断当前节点是否相等
if pRoot1.val != pRoot2.val:
return False
#如果当前节点相等,则继续递归判断相应的左节点和右节点
return self.judge(pRoot1.left,pRoot2.left) and self.judge(pRoot1.right,pRoot2.right)