leetcode
leetcode 501 ~ 550
合并二叉树

合并二叉树

难度:

标签:

题目描述

给你两棵二叉树: 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

代码结果

运行时间: 76 ms, 内存: 15.2 MB


/*
题目思路:
- 使用Java Stream API,虽然Stream API主要用于集合框架,但我们可以通过辅助方法将二叉树转换成列表后再操作。
- 由于本题本质上是递归操作,因此直接使用递归方式更为合适,但我们将用流式思维进行模拟。
*/
import java.util.stream.Stream;
 
public class Solution {
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if (root1 == null) return root2;
        if (root2 == null) return root1;
        TreeNode merged = new TreeNode(root1.val + root2.val);
        merged.left = mergeTrees(root1.left, root2.left);
        merged.right = mergeTrees(root1.right, root2.right);
        return merged;
    }
}
 
// TreeNode类的定义
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

解释

方法:

这个题解使用深度优先搜索(DFS)的方式来合并两棵二叉树。通过同时遍历两棵树的节点,将对应位置的节点值相加,构建出合并后的新二叉树。如果某个位置只在一棵树上有节点,则直接将该节点加入新树中;如果两棵树的对应位置都没有节点,则不进行操作。

时间复杂度:

O(n)

空间复杂度:

O(log(n))

代码细节讲解

🦆
在合并两棵二叉树时,如果遇到一个节点在一棵树中存在而在另一棵树中不存在,直接使用存在的节点是否可能导致原树结构的改变?
在合并两棵二叉树时,如果一个节点在一棵树中存在而在另一棵树中不存在,直接使用存在的节点不会改变原有树的结构,但它会导致合并后的树直接引用原树中的节点。这意味着,如果后续对合并后的树中的这些节点进行修改,可能会影响到原始树的节点,因为两棵树的节点是共享的。理想情况下,应该创建一个新的节点副本,以免原始树的结构或数据受到意外的修改。
🦆
递归合并二叉树时,如果两个树的高度差异很大,会对合并效果产生怎样的影响?
如果两个树的高度差异很大,合并过程中的效率可能会受到影响。具体来说,递归调用将持续进行到较高的树的最深节点,这可能导致在较矮的树已经没有节点可供合并的情况下,递归仍在继续。这不仅影响合并的效率,还可能增加对系统资源的消耗,尤其是在栈空间的使用上。然而,这种情况下合并的结果通常是正确的,只是效率低下。
🦆
合并过程中,若两个对应节点的值相加超出了int类型的范围,该如何处理?
如果在合并过程中两个对应节点的值相加超出了int类型的范围,这会导致整数溢出。处理这种情况的方法可以有几种:1) 修改节点的数据类型为可以容纳更大数值的类型,如长整型(long)。2) 在进行加法操作之前检查值,如果预计会超出范围,则可以设置一个错误处理机制,例如返回一个特定的错误代码或抛出异常。3) 使用Python等语言的特性,它们支持大整数的自动处理,但在其他一些语言中,需要手动处理这些情况。

相关问题