617 字
3 分钟
合并二叉树

题目描述#

给你两棵二叉树: root1 和 root2 。

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

返回合并后的二叉树。

解题思路#

  1. 递归合并策略
    • 若两树当前节点均非空,创建新节点(值 = t1.val + t2.val)
    • 递归合并左子树(t1.left 与 t2.left)
    • 递归合并右子树(t1.right 与 t2.right)
  2. 单树处理
    • 若仅一棵树节点非空,直接返回该节点(子树自动接入)
    • 若两节点均空,返回 null
  3. 原地优化
    • 可在树 t1 上直接修改,避免新建节点(需题目允许)

关键洞察#

  1. 递归终止条件
    • 任一树节点为空时,直接返回另一树的节点(包含子树)
    • 双空节点返回 null,自然终止递归
  2. 子树自动继承
    • 当仅一侧树存在子树时,新树直接继承该子树(无需额外操作)
  3. 无重叠覆盖
    • 因二叉树结构固定,合并只需处理重叠节点值的相加
  4. 时空平衡
    • 递归深度由较深树决定,每节点仅访问一次

复杂度分析#

指标说明
时间复杂度O(min(m,n)):m/n 为两树节点数,递归遍历重叠区域(非重叠节点直接返回)
空间复杂度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) return root2;
if (!root2) return root1;
const root = new TreeNode()
root.val = root1.val + root2.val
root.left = mergeTrees(root1.left, root2.left)
root.right = mergeTrees(root1.right, root2.right)
return root
};

原地修改

/**
* 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}
*/
const mergeTrees = (t1, t2) => {
if (!t1) return t2;
if (!t2) return t1;
t1.val += t2.val;
t1.left = mergeTrees(t1.left, t2.left);
t1.right = mergeTrees(t1.right, t2.right);
return t1;
};

相似题目#

合并二叉树
https://website-truelovings-projects.vercel.app/posts/algorithms/合并二叉树/
作者
欢迎来到StarSky的网站!
发布于
2025-08-10
许可协议
CC BY-NC-SA 4.0