持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情
题目描述
给你两棵二叉树: root1
和 root2
。
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 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]
内,那么 root1
和 root2
可能为空树。
如果 root1
为空树,则返回 root2
。如果 root2
为空树,则返回 root1
。因为一棵树和空树合并仍是这棵树。
节点合并策略
- 如果
node1
为空,则返回node2
。 - 如果
node2
为空,则返回node1
。 - 否则,返回
node1.val + node2.val
。 - 除此之外,还要继续对当前节点的左右子树进行一个递归的合并。
其中步骤 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;
};