[前端]_一起刷leetcode 剑指 Offer 26. 树的子结构

235 阅读2分钟

大家好,我是挨打的阿木木,爱好算法的前端摸鱼老。最近会频繁给大家分享我刷算法题过程中的思路和心得。如果你也是想提高逼格的摸鱼老,欢迎关注我,一起学习。

题目

剑指 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

限制:

0 <= 节点个数 <= 10000

思路

  1. 这道题目我们可以用分治的思想,去把一个复杂的问题,分解成两个简单的问题;
  2. 首先我们可以写一个方法,去判断当前B数的节点是否全等于A数的节点,具体实现的时候,我们只需要递归的判断,当前节点相等,左节点相等,右节点相等即可;
  3. 然后递归的边界是,当B树没有子节点了为止,如果A树没子节点了,但是B树还有剩余,说明也不是子树;
  4. 然后再递归的去判断A树中存不存在与B树头节点值相等的节点,如果存在的话,就执行一次全等判断,如果满足条件则跳出递归,否则拿子节点进行递归判断即可。

实现

/**
 * 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 || !B) {
        return false;
    }

    // 如果当前值相等,那么递归判断是否全等
    if (A.val === B.val && isEqualNode(A, B)) {
        return true;
    }

    // 如果当前节点不满足条件,递归看子节点满不满足
    return isSubStructure(A.left, B) || isSubStructure(A.right, B);
};

function isEqualNode(A, B) {
    // 如果没有B树节点了,说明全部符合条件
    if (!B) {
        return true;
    } 
    
    // 如果到了这一步,说明还有B树节点,这时如果没有A树节点说明不符合条件
    if (!A) {
        return false;
    }

    // 递归判断当前值,左右子节点都符合即可
    return A.val === B.val && isEqualNode(A.left, B.left) && isEqualNode(A.right, B.right);
}

看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。