369 字
2 分钟
算法之合并二叉树

617. 合并二叉树#

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。

你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

image-20210619151739614

思路

  • 同步地遍历两棵树上的节点,直接在 t1 上修改。

    如果把 mergeTrees 函数作为递归函数,参数 t1 和 t2 是指:当前遍历的节点(子树)

递归。总是关注当前节点 t1 为 null 、t2 不是 null,t1t1 换成 t2 。(return t2) t2 为 null、t1t1 不是 null,t1t1 依然 t1 。(return t1)

t1 和 t2 都为 null,t1t1 依然 t1。(return t1)

t1、t2 都存在,将 t2 的值加给 t1 。(t1.val += t2.val)

『子树的合并』交给递归去做,它会对每一个节点做同样的事情。

t1.left = mergeTrees(t1.left, t2.left);
t1.right = mergeTrees(t1.right, t2.right);

image-20210619152328260

代码

const mergeTrees = (t1, t2) => {
if (t1 == null && t2) {
return t2;
}
if ((t1 && t2 == null) || (t1 == null && t2 == null)) {
return t1;
}
t1.val += t2.val;
t1.left = mergeTrees(t1.left, t2.left);
t1.right = mergeTrees(t1.right, t2.right);
return t1;
};

如果不在原树修改,新建一个树呢?#

const mergeTrees = (t1, t2) => {
if (t1 == null && t2) {
return t2;
}
if ((t1 && t2 == null) || (t1 == null && t2 == null)) {
return t1;
}
const root=new TreeNode(t1.val + t2.val)
root.left = mergeTrees(t1.left, t2.left);
root.right = mergeTrees(t1.right, t2.right);
return root;
};
算法之合并二叉树
https://nollieleo.github.io/posts/算法之合并二叉树/
作者
翁先森
发布于
2021-06-19
许可协议
CC BY-NC-SA 4.0