一、题目描述
给你两棵二叉树: 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]
内 -10^4 <= Node.val <= 10^4
二、解题思路
这个问题可以通过递归的方式解决。递归是一种常见的处理树形结构的方法,因为树的定义本身就是递归的。以下是合并两棵树的步骤:
-
如果 root1 或 root2 中的一个是 null,则返回另一个非 null 的节点。这是因为如果一棵树为空,那么合并的结果就是另一棵树。
-
如果 root1 和 root2 都不为 null,则创建一个新的 TreeNode,其值为 root1 和 root2 的值之和。
-
对于新创建的 TreeNode 的左子树,递归地合并 root1 的左子树和 root2 的左子树。
-
对于新创建的 TreeNode 的右子树,递归地合并 root1 的右子树和 root2 的右子树。
-
返回新创建的 TreeNode 作为合并后的树的根节点。
三、具体代码
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
// 如果 root1 为空,直接返回 root2
if (root1 == null) {
return root2;
}
// 如果 root2 为空,直接返回 root1
if (root2 == null) {
return root1;
}
// 创建一个新的 TreeNode,其值为 root1 和 root2 的值之和
TreeNode merged = new TreeNode(root1.val + root2.val);
// 递归合并左子树
merged.left = mergeTrees(root1.left, root2.left);
// 递归合并右子树
merged.right = mergeTrees(root1.right, root2.right);
// 返回合并后的树的根节点
return merged;
}
}
四、时间复杂度和空间复杂度
1. 时间复杂度
对于给定的两棵树 root1
和 root2
,我们需要对每个节点进行一次操作。假设 root1
有 n
个节点,root2
有 m
个节点。
在递归过程中,每个节点都会被访问一次,并且每个节点的合并操作是常数时间的,即合并节点的值和递归调用都是 O(1) 的时间复杂度。
因此,总的时间复杂度是 O(n + m),因为每个节点最多被访问一次。
2. 空间复杂度
空间复杂度主要取决于递归调用的栈空间。在最坏的情况下,两棵树完全不平衡,递归的深度将达到最深的树的深度。假设 root1
和 root2
中的最大深度为 d
,则递归栈的最大深度也为 d
。
因此,空间复杂度是 O(d),其中 d
是两棵树中较深的树的深度。
五、总结知识点
-
类定义:
class Solution
:定义了一个名为Solution
的类。 -
成员方法:
public TreeNode mergeTrees(TreeNode root1, TreeNode root2)
:定义了一个公共方法mergeTrees
,它接受两个TreeNode
类型的参数并返回一个TreeNode
类型的结果。 -
递归:递归是一种编程技巧,方法
mergeTrees
在其实现中调用了自身,这是递归的基本特征。 -
条件语句:
if
语句用于检查root1
和root2
是否为null
,这是递归的基本条件判断。 -
对象创建:
TreeNode merged = new TreeNode(root1.val + root2.val);
:使用new
关键字创建了一个新的TreeNode
对象。 -
成员变量访问:
root1.val
和root2.val
:访问了TreeNode
对象的val
成员变量。 -
成员变量赋值:
merged.left
和merged.right
:通过递归调用将合并后的子树赋值给新创建的TreeNode
对象的left
和right
成员变量。 -
返回语句:
return
语句用于返回递归调用的结果或者直接返回非null
的树节点。 -
递归终止条件:当
root1
或root2
为null
时,递归调用将直接返回另一个非null
的节点,这是递归的终止条件。 -
类型定义:
TreeNode
类型是一个自定义的类,它代表了二叉树的一个节点,包含val
、left
和right
三个成员变量。
以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。