【LeetCode】每日一题 572. 另一棵树的子树

70 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

572. 另一棵树的子树

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

「示例1:」

alt 示例1

输入:root = [3,4,5,1,2], subRoot = [4,1,2]
输出:true
「示例2:」

alt 示例2

输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]
输出:false
「提示:」
root 树上的节点数量范围是 [1, 2000]
subRoot 树上的节点数量范围是 [1, 1000]
-104 <= root.val <= 104
-104 <= subRoot.val <= 104

解题思路

// 递归遍历
​
判断一个二叉树中是否含有另一个二叉树
​
首先我们需要一个比较的函数compare,用来比较两个树的节点是否相等,如果相等返回true,否则返回false,树的左边和左边进行比较,右边和右边进行比较
​
如果通过比较,我们发现这个compare函数直接返回true,则代表两个树相等
​
如果是比较复杂的树,我们就需要使用递归便利,来不断的进行比较,直到遍历完整棵树才能得到结果。

代码实现

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @param {TreeNode} subRoot
 * @return {boolean}
 */
var isSubtree = function(root, subRoot) {
    // 比较二叉树
    const compare = (left, right) => {
        if (left === null && right === null) {
            return true;
        } else if (
            left !== null && right === null ||
            left === null && right !== null ||
            left.val !== right.val 
        ) {
            return false;
        }
​
        let leftSide = compare(left.left, right.left);
        let rightSide = compare(left.right, right.right);
        let simeSide = leftSide && rightSide;
        return simeSide;
    }
​
    // 判断root不能为null
    if (root === null) return false;
​
    // 如果两个树直接项目,则直接返回true,就不用递归便利了
    if (compare(root,subRoot)) return true;
​
    // 复杂的情况需要进行递归遍历,看两个树是否有相同的地方
    return isSubtree(root.left,subRoot) || isSubtree(root.right, subRoot);
};

如果你对这道题目还有疑问的话,可以在评论区进行留言;