二叉树题目:合并二叉树

news2025/1/11 2:44:27

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:合并二叉树

出处:617. 合并二叉树

难度

3 级

题目描述

要求

给定两个二叉树 root1 \texttt{root1} root1 root2 \texttt{root2} root2

想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些结点会重叠,另一些结点不会重叠。你需要将它们合并为一个新的二叉树。合并的规则是如果两个结点重叠,那么将它们的值相加作为结点合并后的新值,否则不为空的结点将直接作为新二叉树的结点。

返回合并后的二叉树。

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

示例

示例 1:

示例 1

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

示例 2:

输入: root1   =   [1],   root2   =   [1,2] \texttt{root1 = [1], root2 = [1,2]} root1 = [1], root2 = [1,2]
输出: [2,2] \texttt{[2,2]} [2,2]

数据范围

  • 树中结点数目在范围 [0,   2000] \texttt{[0, 2000]} [0, 2000]
  • -10 4 ≤ Node.val < 10 4 \texttt{-10}^\texttt{4} \le \texttt{Node.val} < \texttt{10}^\texttt{4} -104Node.val<104

解法一

思路和算法

在合并两个二叉树之前,首先需要判断两个二叉树是否为空。如果两个二叉树都为空,则合之后的二叉树也为空;如果两个二叉树有一个为空,则合并后的二叉树为另一个非空二叉树。

当两个二叉树都不为空时,需要对两个二叉树的相同位置的结点分别合并。合并后的二叉树的根结点值为两个二叉树的根结点值之和,合并后的二叉树的根结点的左子树为两个二叉树的根结点的左子树合并后的结果,合并后的二叉树的根结点的右子树为两个二叉树的根结点的右子树合并后的结果。

合并二叉树的过程是一个递归的过程,递归的终止条件是当前的两个二叉树中至少有一个为空。当两个二叉树都不为空时,首先计算合并后的二叉树的根结点值,然后对两个二叉树的根结点的左子树和右子树分别执行合并操作并作为合并后的二叉树的根结点的左子树和右子树,即可完成二叉树的合并。

代码

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;
    }
}

复杂度分析

  • 时间复杂度: O ( min ⁡ ( m , n ) ) O(\min(m, n)) O(min(m,n)),其中 m m m n n n 分别是两个二叉树的结点数。同时遍历两个二叉树,只有当两个二叉树在相同位置的结点都不为空时才会对该位置的结点执行显性合并操作,因此执行显性合并操作的结点数不超过较小的二叉树的结点数。

  • 空间复杂度: O ( min ⁡ ( m , n ) ) O(\min(m, n)) O(min(m,n)),其中 m m m n n n 分别是两个二叉树的结点数。空间复杂度主要是递归调用的栈空间,栈空间不超过较小的二叉树的高度,最坏情况下二叉树的高度和结点数相等。

解法二

思路和算法

也可以使用广度优先搜索合并二叉树。同样首先判断两个二叉树是否为空,如果两个二叉树至少有一个为空,则可以直接得到合并后的二叉树。当两个二叉树都不为空时,合并后的二叉树的根结点值为两个二叉树的根结点值之和,从合并后的二叉树和两个原始二叉树的根结点开始同时广度优先搜索。

使用三个队列分别存储合并后的二叉树的结点、第一个二叉树的结点、第二个二叉树的结点。初始时将三个根结点分别入三个队列,遍历过程中,每次从三个队列中分别将一个结点出队列,并获得两个原始二叉树的当前结点的左子结点和右子结点,以下将合并后的二叉树的当前结点称为合并结点,将原始二叉树的当前结点称为原始结点,执行合并操作。

以下为左子结点的合并操作。

  • 如果两个原始结点的左子结点都不为空,则合并结点的左子结点值为两个原始结点的左子结点值之和,将合并结点的左子结点和两个原始结点的左子结点分别入三个队列。

  • 如果两个原始结点的左子结点只有一个不为空,则将两个原始结点中的非空的左子结点作为合并结点的左子结点,此时合并结点的左子树即为两个原始结点中的非空的左子树,不需要对非空的左子树继续遍历,因此不需要将左子结点入队列。

  • 如果两个原始结点的左子结点都为空,则合并结点的左子结点也为空。

对于右子结点,使用相同的操作执行合并。

当队列为空时遍历结束,此时二叉树合并完毕。

代码

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);
        Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
        Queue<TreeNode> queue1 = new ArrayDeque<TreeNode>();
        Queue<TreeNode> queue2 = new ArrayDeque<TreeNode>();
        queue.offer(merged);
        queue1.offer(root1);
        queue2.offer(root2);
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll(), node1 = queue1.poll(), node2 = queue2.poll();
            TreeNode left1 = node1.left, right1 = node1.right, left2 = node2.left, right2 = node2.right;
            if (left1 != null || left2 != null) {
                if (left1 != null && left2 != null) {
                    TreeNode left = new TreeNode(left1.val + left2.val);
                    node.left = left;
                    queue.offer(left);
                    queue1.offer(left1);
                    queue2.offer(left2);
                } else if (left1 != null) {
                    node.left = left1;
                } else {
                    node.left = left2;
                }
            }
            if (right1 != null || right2 != null) {
                if (right1 != null && right2 != null) {
                    TreeNode right = new TreeNode(right1.val + right2.val);
                    node.right = right;
                    queue.offer(right);
                    queue1.offer(right1);
                    queue2.offer(right2);
                } else if (right1 != null) {
                    node.right = right1;
                } else {
                    node.right = right2;
                }
            }
        }
        return merged;
    }
}

复杂度分析

  • 时间复杂度: O ( min ⁡ ( m , n ) ) O(\min(m, n)) O(min(m,n)),其中 m m m n n n 分别是两个二叉树的结点数。同时遍历两个二叉树,只有当两个二叉树在相同位置的结点都不为空时才会访问该位置的结点,因此访问的结点数不超过较小的二叉树的结点数。

  • 空间复杂度: O ( min ⁡ ( m , n ) ) O(\min(m, n)) O(min(m,n)),其中 m m m n n n 分别是两个二叉树的结点数。空间复杂度主要是队列空间,队列内元素个数不超过较小的二叉树的结点数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/749534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java项目之多人命题系统(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的多人命题系统。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&…

zabbix部署及应用(自定义监控内容,zabbix 自动发现与自动注册,zabbix 代理服务器,Zabbix 高可用集群)

zabbix部署及应用 一、添加 zabbix 客户端主机1、服务端和客户端都配置时间同步2、服务端和客户端都设置 hosts 解析3、设置 zabbix 的下载源&#xff0c;安装 zabbix-agent24、修改 agent2 配置文件5、启动 zabbix-agent26、在服务端验证 zabbix-agent2 的连通性7、常用的键值…

一、对象的概念(1)

本章概要 抽象接口服务提供封装 抽象 “我们没有意识到惯用语言的结构有多大的力量。可以毫不夸张地说&#xff0c;它通过语义反应机制奴役我们。语言表现出来并在无意识中给我们留下深刻印象的结构会自动投射到我们周围的世界。” – Alfred Korzybski (1930) 计算机革命的起…

分布式锁【 基于synchronized锁解决超卖问题、分布式锁解决方案、悲观锁实现的分布式锁】(二)-全面详解(学习总结---从入门到深化)

目录 分布式锁问题_演示问题 基于synchronized锁解决超卖问题 分布式锁解决方案 分布式锁实现方案 分布式锁解决方案_数据库悲观锁实现的分布式锁 项目中使用for update 分布式锁问题_演示问题 启动订单服务9090 启动订单服务9091 创建两个SpringBoot服务 启动Nginx服务 下载N…

火山引擎云搜索服务升级云原生新架构;提供数十亿级分布式向量数据库能力

从互联网发展伊始&#xff0c;搜索技术就绽放出了惊人的社会和经济价值。随着信息社会快速发展&#xff0c;数据呈爆炸式增长&#xff0c;搜索技术通过数据收集与处理&#xff0c;满足信息共享与快速检索的需求。 云搜索服务 ESCloud 是火山引擎提供的完全托管在线分布式搜索服…

OJ练习第135题——下降路径最小和

下降路径最小和 力扣链接&#xff1a;931. 下降路径最小和 题目描述 给你一个 n x n 的 方形 整数数组 matrix &#xff0c;请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始&#xff0c;并从每一行中选择一个元素。在下一行选择…

永磁同步电机磁场定向控制(FOC)及Matlab/Simulink仿真分析

前言 做永磁同步电机控制绕不开FOC&#xff0c;本章节主要介绍FOC控制的基本原理、坐标变换以及永磁同步电机在同步旋转坐标系下的数学模型&#xff0c;并通过Matlab/Simulink进行永磁同步电机FOC控制算法的仿真分析。 01 FOC的基本原理 磁场定向控制&#xff08;Field-Ori…

分割3-转置卷积可逆吗?

上一话 分割2——语义分割评价指标https://blog.csdn.net/XiaoyYidiaodiao/article/details/125149509?spm1001.2014.3001.5502 转置卷积不是卷积的逆操作&#xff0c;并且转置卷积是卷积操作&#xff01; 这是因为普通卷积的操作图 1. 图1 其卷积可等效为图 2. 图2 其卷积操…

Offset Explorer2 监视kafka的利器

kafka作为一个生产者和消费者集为一体的框架&#xff0c;消费者必须一直保持打开的状态&#xff0c;并且每隔一段时间接收一次数据&#xff0c;才能够保持生产者放入的数据及时被处理掉&#xff0c;而生产者则可以每隔一段时间发送一波数据&#xff0c;这样消费者就能够接收到了…

Mysql搭建互为主从数据库

Mysql搭建互为主从数据库 一、搭建前期说明二、mysql文件结构以及配置说明1、mysqlA文件结构2、mysqlB文件结构3、mysqlA的配置文件my.cnf4、mysqlB的配置文件my.cnf5、启动mysqlA服务器脚本startMysqlA.sh6、启动mysqlB服务器脚本startMysqlB.sh7、查看服务启动情况 三、设置主…

【Redis】之缓存一致性

1、缓存一致性 对于使用 Redis 作为缓存来说&#xff0c;如何保证数据库和缓存数据一致性是个麻烦的问题。对于缓存和数据库的操作&#xff0c;主要有以下两种方式&#xff1a; 先删缓存&#xff0c;再更新数据库&#xff1b;先更新数据库&#xff0c;再删除缓存&#xff1b;…

【UE4 塔防游戏系列】02-基础设置

步骤 1. 新建一个蓝图&#xff0c;父类为游戏模式基础 命名为“TaFangGameMode” 2. 新建一个玩家控制器 命名为“TaFangGamePlayerController” 3. 在世界场景设置中&#xff0c;选择游戏覆盖模式为“TaFangGameMode” 默认Pawn类设为None&#xff0c;玩家控制器类选择“TaFa…

使用rest-assured框架优雅实现接口测试断言

对于接口测试来说&#xff0c;只判断响应状态码为200是远远不够的&#xff0c;我们经常必须去验证响应内容中的业务字段是否正确&#xff0c;本文将采用Rest-Assured框架来实现接口响应的判断。 1、接口信息的调试 当我们在做接口测试时&#xff0c;通常希望将接口的请求及响…

包装类(wrapper)

包装类(wrapper) 包装类和基本数据类型间的转换(Interger演示) public class WrapperType01 {public static void main(String[] args) {int a 10;// 手动封箱&#xff0c;Integer integer Integer.valueOf(a);System.out.println(integer);// 手动拆箱int i integer.intVa…

十五周算法训练营——岛屿问题

今天是十五周算法训练营的第十五周&#xff0c;主要讲岛屿问题专题。&#xff08;欢迎加入十五周算法训练营&#xff0c;与小伙伴一起卷算法&#xff09; 岛屿问题 一、题目 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff…

11. 利用Tomcat服务器配置HTTPS双向认定

文章目录 Tomcat配置HTTPS1.为服务器生成证书2.为客户端生成证书3.让服务器信任客户端证书4.将该文件导入到服务器的证书库&#xff0c;添加为一个信任证书使用命令如下&#xff1a;5.查看证书库6.让客户端信任服务器证书7.配置tomcat8.验证 Tomcat配置HTTPS 1.启动cmd控制台&…

分布式锁【分布式锁概述、业务介绍、创建SpringBoot项目】(一)-全面详解(学习总结---从入门到深化)

目录 分布式锁概述 分布式锁问题_业务介绍 分布式锁问题_创建SpringBoot项目 分布式锁概述 为什么需要分布式锁 在单机部署的系统中&#xff0c;使用线程锁来解决高并发的问题&#xff0c;多线程访问共享变量的问题达到数据一致性&#xff0c;如使用synchornized、 Reentran…

第一堂棒球课品牌设计·棒球1号位

需求背景 第一堂棒球课作为国内的创新体育课程&#xff0c;旨在为广大青少年提供一个更好的平台来接触并了解棒球这项运动。品牌的建设将影响到其在国内的认可度和知名度。在此背景下&#xff0c;我们的产品目标是为第一堂棒球课打造一个具有竞争力的品牌形象&#xff0c;满足…

基于jeecg-boot的nbcio-boot亿事达企业管理平台发布

目前这个演示系统与代码都同步&#xff0c;以后也尽量保持同步。 更多功能看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/nbcio-boot 前端代码&#xff1a;https://gitee.com/nbacheng/nbcio-vue.git 在线演示&#xff08;包括H5&#xff…

「Java核心技术大会 2023」6月启动,邀你共同探讨Java生态

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…