剑指 Offer 26. 树的子结构

119 阅读2分钟

题目

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

限制:

0 <= 节点个数 <= 10000

题解

要查找树A中是否存在和树B结构一样的子树, 可以分成两步:

  1. A中找到和B的根节点一样的值的节点R
  2. 判断A中以R为根节点的子树是否包含和树B一样的结构

具体流程如下:

  1. 如果A或者B都为空树,直接返回false

  2. 如果BA的子树,应该满足下面三种情况之一:

    1. 以节点A的为根节点的子树包含B
    2. B 是A的左子树的子结构
    3. B 是A的右子树的子结构
  3. 递归函数recur的判断逻辑

    1. 当节点 Bnull, 说明已经匹配所有节点,返回true
    2. 当节点 Anull, 说明遍历完A的所有节点都没有匹配,返回false
    3. 当节点AB的值不相等,返回false
    4. 递归的判断,AB的左节点是否相等 且 AB的右节点是否相等

代码


/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} A
 * @param {TreeNode} B
 * @return {boolean}
 */
var isSubStructure = function(A, B) {
    if (A == null || B == null) return false;
    return recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B)
    function recur(A, B) {
        if (B == null) return true;
        if (A == null || A.val != B.val) return false;
        return recur(A.left, B.left) && recur(A.right, B.right)
    }

};

原题链接

剑指 Offer 26. 树的子结构