LeetCode 617. 合并二叉树

0 阅读3分钟

LeetCode 617. 合并二叉树

摘要

LeetCode 617 合并二叉树题解,使用递归前序遍历同时遍历两棵树,将对应节点值相加,空节点直接复用另一棵树,时间复杂度 O(min(n, m)),空间复杂度 O(min(n, m))(递归栈)。

标签

#算法 #LeetCode #二叉树 #递归 #DFS #题解

目录

  1. 题目描述
  2. 易错点
  3. 思路
  4. 编写代码

1. 题目描述

给你两棵二叉树:root1 和 root2

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

返回合并后的二叉树。

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

示例 1:

text

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

示例 2:

text

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

提示:

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

2. 易错点

  1. 若当前节点有一方为空,则直接返回另一方节点(无需继续递归),因为非空节点及其子树可以直接复用。
  2. 若两个节点均不为空,则值相加,并递归合并左右子树。
  3. 注意递归终止条件:只要有一个节点为空就返回另一个。
  4. 原地修改 root1 并返回,无需额外分配新节点,节省空间。
  5. 递归顺序采用前序遍历(先处理当前节点,再处理左右子树)。

3. 思路

本题采用递归前序遍历同时遍历两棵树:

  • 定义递归函数 mergeTrees(root1, root2),返回合并后的节点。

  • 终止条件

    • 若 root1 == NULL,直接返回 root2root2 及其子树直接复用)。
    • 若 root2 == NULL,直接返回 root1
  • 若两个节点都不为空,则:

    1. 将 root2->val 累加到 root1->val
    2. 递归合并左子树:root1->left = mergeTrees(root1->left, root2->left)
    3. 递归合并右子树:root1->right = mergeTrees(root1->right, root2->right)
    4. 返回 root1

这种方法直接在 root1 上进行修改,无需创建新节点,空间效率高。每次递归只处理重叠的节点,非重叠部分直接复用,因此时间复杂度为 O(min(n, m)),其中 n 和 m 分别为两棵树的节点数。


4. 编写代码

c 运行

c

struct TreeNode* mergeTrees(struct TreeNode* root1, struct TreeNode* root2) {
    if(!root1) return root2;
    if(!root2) return root1;
    root1->val += root2->val;
    root1->left = mergeTrees(root1->left, root2->left);
    root1->right = mergeTrees(root1->right, root2->right);
    return root1;
}