题目
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路
看题目明显知道是遍历树的任务,而且遍历树应该第一时间反应出来的应该是递归实现遍历树。
题目是判断树B是否是树A的子结构,分两步走:
第一步,首先从上往下遍历寻找A,判断A是否存在于B根节点值R相同的节点
第二步,判断在树A中以R为根节点的子树是否与树B具有相同的结构
def TreeNode:
def __init(self, x):
self.val = x
self.left = None
self.right = None
def HasSubtree(p1, p2):
if not p1 or not p2:
return False
result = False
# 第一步,在树A中查找与树B根节点的值相等的节点,如果当前节点不相等,则左右节点递归查找
if p1.val == p2.val:
# 第二步,判断树A中以R为根节点的子树是否与树B具有相同的结构
result = is_Subtree(p1, p2)
if not result:
result = HasSubtree(p1.left, p2)
if not result:
result = HasSubtree(p1.right, p2)
return result
def is_Subtree(p1, p2):
if not p2: # 递归遍历完树B都没有返回False的话,说明树B是树A的以R为根节点的子树
return True
if not p1 or p1.val != p2.val: # 树B还没遍历完,树A已经遍历完说明不是子树
return False # 树B某节点的值与树A对应节点的值不等,说明不是子树
# 递归判断树的左右节点是否都相等
return is_Subtree(p1.left, p2.left) and is_Subtree(p1.right, p2.right)