LeetCode-剑指 Offer 26. 树的子结构

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:递归

  • 循环遍历A结点,查看B结点是否是当前A的子节点,若是,返回True,否则
  • 遍历A的左子树,查看B结点是否是当前A的子节点,若是,返回True,否则
  • 遍历A的右子树,查看B结点是否是当前A的子节点,若是,返回True,否则返回False
  • 查看B结点是否是当前A的子节点:通过对A和B的子节点进行遍历:
    • 如果B为空,返回True,说明B是A的子节点
    • 如果A为空,或者B和A的值不相等,返回False
    • 循环A和B的左右子节点,用and连接,只有都相等才会返回True
# 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:
        # 循环遍历A树
        if not A or not B: return False

        def dfs(A, B):
            # 判断B是否是A的子结构
            if B is None: return True
            if A is None: return False
            if A.val != B.val: return False
            return dfs(A.left, B.left) and dfs(A.right, B.right)

        return dfs(A, B) or self.isSubStructure(A.left, B) or self.isSubStructure(A.right, B)
posted @ 2022-03-23 11:11  小Aer  阅读(3)  评论(0编辑  收藏  举报  来源