手摸手提桶跑路——LeetCode617. 合并二叉树

122 阅读1分钟

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

题目描述

给你两棵二叉树: root1root2

想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。

返回合并后的二叉树。

注意: 合并过程必须从两个树的根节点开始。

示例 1:

输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]
输出:[3,4,5,5,4,null,7]

示例 2:

输入:root1 = [1], root2 = [1,2]
输出:[2,2]

提示:

  • 两棵树中的节点数目在范围 [0, 2000] 内
  • -104 <= Node.val <= 104

解题思路

通过阅读题目,我们可以得出如下信息。

边界

首先是数据的边界。已知节点数据在 [0, 2000] 内,那么 root1root2 可能为空树。

如果 root1 为空树,则返回 root2。如果 root2 为空树,则返回 root1。因为一棵树和空树合并仍是这棵树。

节点合并策略

  1. 如果 node1 为空,则返回 node2
  2. 如果 node2 为空,则返回 node1
  3. 否则,返回 node1.val + node2.val
  4. 除此之外,还要继续对当前节点的左右子树进行一个递归的合并。

其中步骤 1 和步骤 2 中返回的节点,是充当上一层递归中的左(右)节点。

n1.left = recursion(n1.left, n2.left); 
n1.right = recursion(n1.right, n2.right);

复杂度

时间复杂度:O(min(m,n))

空间复杂度:O(min(m,n))

题解

/**
 * 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} root1
 * @param {TreeNode} root2
 * @return {TreeNode}
 */
var mergeTrees = function(root1, root2) {
    if(root1 == null || root2 == null) {
        return root1 == null? root2 : root1;
    }
    const recursion = (n1, n2) => {
        if(n1 == null || n2 == null) {
            return n1 == null? n2 : n1;
        }
        n1.val += n2.val;
        n1.left = recursion(n1.left, n2.left);
        n1.right = recursion(n1.right, n2.right);
        return n1;
    }
    recursion(root1, root2);
    return root1;
};

捕获.PNG

巩固提高

  1. 手摸手提桶跑路——LeetCode617. 合并二叉树 - 掘金 (juejin.cn)
  2. 手摸手提桶跑路——使用 DFS 进行二叉树的遍历 - 掘金 (juejin.cn)
  3. 手摸手提桶跑路——LeetCode662. 二叉树最大宽度 - 掘金 (juejin.cn)
  4. 手摸手提桶跑路——LeetCode199. 二叉树的右视图 - 掘金 (juejin.cn)
  5. 手摸手提桶跑路——LeetCode1302. 层数最深叶子节点的和 - 掘金 (juejin.cn)
  6. 手摸手提桶跑路——LeetCode100. 相同的树 - 掘金 (juejin.cn)