题目描述
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如: 给定的树 A:
3
/ \
4 5
/ \
1 2给定的树 B:
4
/
1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。示例 1:
输入:A = [1,2,3], B = [3,1]
输出:false示例 2:
输入:A = [3,4,5,1,2], B = [4,1]
输出:true
解题思路: 递归深度优先遍历
- 首先判断子树是否遍历完成, 如果子树遍历完成那么也就是说我们找到了对应的子结构, 返回True
- 如果父节点为空, 或者父节点的val与子节点val不同, 说明当前节点已经不是子结构了, 直接返回False
- 如果当前父节点和子节点的val相同, 那么我们就分别递归2个节点的左右节点
示例代码
def isSubStructure(A: TreeNode, B: TreeNode) -> bool:
def dfs(f, s):
if not s:
return True
if not f or f.val != s.val:
return False
return dfs(f.left, s.left) and dfs(f.right, s.right)
if not A or not B:
return False
return dfs(A, B) or isSubStructure(A.left, B) or isSubStructure(A.right, B)