这道题目要求判断二叉树B是否是二叉树A的一个子结构。解决这个问题的基本思想是使用递归。首先,如果B为空,根据题目定义,返回False。如果A为空,也返回False,因为空树不能包含非空子树。接下来,定义一个内部的辅助函数dfs来判断从某个节点开始的子树是否与B具有相同的结构和值。如果B的当前节点为空,说明B已经匹配完成,返回True;如果A的当前节点为空,而B不为空,返回False。如果两个节点值相等,递归地比较它们的左右子树。最后,递归地在A的左右子树中搜索是否存在与B结构相同的子树。
时间复杂度: O(M*N)
空间复杂度: O(h)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isSubStructure(self, A: TreeNode, B: TreeNode) -> bool:
# 如果B为空,根据定义直接返回False
if B is None:
return False
# 如果A为空,无法匹配非空B
if A is None:
return False
# 定义dfs函数,检查以p为根的子树是否与q相同
def dfs(p, q):
# 如果q为空,说明B已经完全匹配
if q is None:
return True
# 如果p为空,但q不为空,匹配失败
if p is None:
return False
# 检查当前节点值是否相等,并递归检查左右子树
return p.val == q.val and dfs(p.left, q.left) and dfs(p.right, q.right)
# 检查当前节点开始的子树,或递归检查左右子树
return dfs(A, B) or self.isSubStructure(A.left, B) or self.isSubStructure(A.right, B)