LeetCode题练习与总结:合并二叉树--617

一、题目描述

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

二、解题思路

这个问题可以通过递归的方式解决。递归是一种常见的处理树形结构的方法,因为树的定义本身就是递归的。以下是合并两棵树的步骤:

  1. 如果 root1 或 root2 中的一个是 null,则返回另一个非 null 的节点。这是因为如果一棵树为空,那么合并的结果就是另一棵树。

  2. 如果 root1 和 root2 都不为 null,则创建一个新的 TreeNode,其值为 root1 和 root2 的值之和。

  3. 对于新创建的 TreeNode 的左子树,递归地合并 root1 的左子树和 root2 的左子树。

  4. 对于新创建的 TreeNode 的右子树,递归地合并 root1 的右子树和 root2 的右子树。

  5. 返回新创建的 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 是两棵树中较深的树的深度。

五、总结知识点

  1. 类定义class Solution:定义了一个名为 Solution 的类。

  2. 成员方法public TreeNode mergeTrees(TreeNode root1, TreeNode root2):定义了一个公共方法 mergeTrees,它接受两个 TreeNode 类型的参数并返回一个 TreeNode 类型的结果。

  3. 递归:递归是一种编程技巧,方法 mergeTrees 在其实现中调用了自身,这是递归的基本特征。

  4. 条件语句if 语句用于检查 root1 和 root2 是否为 null,这是递归的基本条件判断。

  5. 对象创建TreeNode merged = new TreeNode(root1.val + root2.val);:使用 new 关键字创建了一个新的 TreeNode 对象。

  6. 成员变量访问root1.val 和 root2.val:访问了 TreeNode 对象的 val 成员变量。

  7. 成员变量赋值merged.left 和 merged.right:通过递归调用将合并后的子树赋值给新创建的 TreeNode 对象的 left 和 right 成员变量。

  8. 返回语句return 语句用于返回递归调用的结果或者直接返回非 null 的树节点。

  9. 递归终止条件:当 root1 或 root2 为 null 时,递归调用将直接返回另一个非 null 的节点,这是递归的终止条件。

  10. 类型定义TreeNode 类型是一个自定义的类,它代表了二叉树的一个节点,包含 valleft 和 right 三个成员变量。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直学习永不止步

谢谢您的鼓励,我会再接再厉的!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值