剑指 Offer 26. 树的子结构

143 阅读1分钟

题目描述

输入两棵二叉树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

解题思路: 递归深度优先遍历

  1. 首先判断子树是否遍历完成, 如果子树遍历完成那么也就是说我们找到了对应的子结构, 返回True
  2. 如果父节点为空, 或者父节点的val与子节点val不同, 说明当前节点已经不是子结构了, 直接返回False
  3. 如果当前父节点和子节点的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)