LeetCode刷题之HOT100之合并二叉树

news2024/11/15 8:42:15

2024/5/26 晴。是的,等下我要去长乐沙滩赶海哈哈,因为这几天数字峰会,地铁公交又免费啦。ok,今天做的是HOT100里面最后一道easy题目啦,明天就是要跨越一个难度啦!做题吧

1、题目描述

在这里插入图片描述

2、逻辑分析

题目要求:给定两个二叉树,要求合并它们。合并的规则就是:类似于将它们叠起来,重合部分相加,未重合部分就为数值不为空的数据加入。那么,怎么做呢?我的思路是:以深度或广度优先搜索来遍历这两棵树A和B,遍历顺序同步,如果相同节点都有数据,那么相加后给到A树上,如果只有一个树节点有数据,也是给到A树对应的节点上,最后返回A树即可。看了题解,官方也是给出了这两种方法。官方给出的步骤分析非常清晰,我直接放这里:LeetCode题解

3、代码演示

```java
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        // 如果 root1 为 null,直接返回 root2
        if( root1 == null){
            return root2;
        }
        // 如果 root2 为 null,直接返回 root1
        if(root2 == null){
            return root1;
        }
        // 创建一个新的节点 merged,值为 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;
    }

时间复杂度:O(min(m,n)),空间复杂度:O(min(m,n))。

深度优先搜索里面是递归的思想,之前也做过几道类似的题目,所以理解起来很顺畅,接下来看看广度优先搜索的具体实现吧。实现思路:使用三个队列,两个用来存放两个二叉树遍历的值,另一个用来存储新二叉树的值。直接上代码:

public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if(root1 == null){
            return root2;
        }
        if(root2 == null){
            return root1;
        }
        // 创建一个新的节点 merged,值为 root1 和 root2 对应节点值之和
        TreeNode merged = new TreeNode(root1.val + root2.val);
        // 创建三个队列:一个用于存储合并后的节点,一个用于存储 root1 的节点,一个用于存储 root2 的节点
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        Queue<TreeNode> queue1 = new LinkedList<TreeNode>();
        Queue<TreeNode> queue2 = new LinkedList<TreeNode>();
        // 将 merged 节点添加到 queue 队列中
        queue.offer(merged);
        // 将 root1 和 root2 分别添加到 queue1 和 queue2 队列中
        queue1.offer(root1);
        queue2.offer(root2);
        // 当 queue1 和 queue2 都不为空时,进行循环处理
        while(!queue1.isEmpty() && !queue2.isEmpty()){
            // 从 queue、queue1 和 queue2 中分别取出一个节点
            TreeNode node = queue.poll(), node1 = queue1.poll(), node2 = queue2.poll();
            // 获取 node1 和 node2 的左右子节点
            TreeNode left1 = node1.left, left2 = node2.left, right1 = node1.right, right2 = node2.right;
            // 处理左子节点的合并
            if(left1 != null || left2 != null){
                if(left1 != null && left2 != null){
                    // 创建一个新的左子节点,值为 left1 和 left2 的值之和
                    TreeNode left = new TreeNode(left1.val + left2.val);
                    node.left = left;
                    queue.offer(left);
                    queue1.offer(left1);
                    queue2.offer(left2);
                // 如果 left1 不为 null,则直接将其赋给 node 的左子节点
                }else if(left1 != null){
                    node.left = left1;
                // 如果 left2 不为 null,则直接将其赋给 node 的左子节点
                }else if(left2 != null){
                    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 if(right2 != null){
                    node.right = right2;
                }
            }
        }
        // 返回合并后的新二叉树的根节点
        return merged;
    }

代码比较冗长,但是理解起来还是很方便了,逻辑更为清晰了。时间复杂度:O(min(m,n)),空间复杂度:O(min(m,n))。

ok啦,HOT100的Easy部分也就告一段落啦,接下来就是中等和困难啦!准备去赶海啦,这对一个中部地区生长的孩子是有莫大的吸引力的,BYE!

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

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

相关文章

Python脚本必加代码:99%的程序员都忽视了这个细节!

文章目录 一、初识 if __name__ __main__二、__name__ 和 __main__ 是什么&#xff1f;三、实战讲解四、实际应用场景测试代码提高代码可重用性避免不必要的执行 五、深入理解和更多用法使用 argparse 解析命令行参数使用 unittest 进行单元测试使用 multiprocessing 创建子进…

任推邦:实力强劲的APP推广拉新平台,号称不扣量

任推邦简介 任推邦是国内数一数二的项目分发平台&#xff0c;也是一个不扣量的项目APP推广拉新平台&#xff0c;隶属于聚名科技集团股份有限公司。聚名科技成立时间在2012年&#xff0c;是安徽省老牌互联网企业&#xff0c;历经11年的飞速发展&#xff0c;聚名科技成功布局打造…

Adobe Bridge BR v14.0.3 安装教程 (多媒体文件组织管理工具)

Adobe系列软件安装目录 一、Adobe Photoshop PS 25.6.0 安装教程 (最流行的图像设计软件) 二、Adobe Media Encoder ME v24.3.0 安装教程 (视频和音频编码渲染工具) 三、Adobe Premiere Pro v24.3.0 安装教程 (领先的视频编辑软件) 四、Adobe After Effects AE v24.3.0 安装…

探秘NumPy的奥秘:元素级操作与广播机制

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、NumPy基础与元素级操作 元素级操作的引入 元素级操作详解 广播机制初探 二、NumPy矩…

PostgreSQL基础(三):PostgreSQL的基础操作

文章目录 PostgreSQL的基础操作 一、用户操作 二、权限操作 三、操作任务

全免费的数据恢复工具哪个好?分享2024年性价比超高的12款数据恢复软件!

当您丢失重要文件时&#xff0c;您应该可不想遇到措手不及的情况吧&#xff1f;相反&#xff0c;您需要在系统中使用一些可靠的数据恢复软件&#xff0c;但是全免费的数据恢复工具哪个好呢&#xff1f;别担心&#xff0c;本文将帮助您选择最适合您的解决方案。 如何挑选一款合适…

Linux 基本使用和 web 程序部署云端

目录 1.Linux发行版 2.Linux常用命令 ls pwd cd touch mkdir cat rm cp mv man vim grep ps netstat 绝对路径 vs 相对路径 使用 tab 键补全 使用 ctrl c 重新输入 粘贴与复制快捷键 3.Linux环境搭建 环境搭建方式 使用云服务器 4.搭建Java部署环境 …

CnosDB:深入理解时序数据质量函数

在CnosDB中&#xff0c;我们设计并实现了计算数据质量的多个指标&#xff0c;这些指标可以从多个维度评估时序数据的质量&#xff0c;对于时间戳列&#xff0c;我们考虑数据的缺失点、冗余点和延迟点。对于值列&#xff0c;我们考虑数据的异常值、范围、变化、速度和加速度。 C…

AI应用案例:影像报告智能辅助编辑系统

今天给大家介绍一个医疗行业的案例“影像报告智能辅助编辑系统”&#xff01;该案例已经在某三甲医院落地&#xff0c;模型准确度超过80%。 该项目上线后&#xff0c;保守估计&#xff0c;能为每位医生的每一张报告至少省下1分钟时间和2分钟的精力&#xff0c;20位初级医生&…

大作业爬取手机数据,实现手机推荐系统以及朋友圈手机论坛

1、功能简介 &#xff08;1&#xff09;用户注册与用户登录 &#xff08;2&#xff09;手机搜索、手机比拼、手机个性化推荐 &#xff08;3&#xff09;点击搜索的手机图片会就用户行为&#xff0c;轮播展示用户行为&#xff0c;推荐点击次数靠前的手机 &#xff08;4&#xf…

Day01-Web开发、介绍、HTML

一、什么是 Web ? Web:全球广域网&#xff0c;也称为万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站。 <!-- 文档类型为HTML --> <!DOCTYPE html> <html lang"en"> <head><!-- 字符集 --><meta charset"U…

【Python001】python批量下载、插入与读取Oracle中图片数据(已更新)

1.熟悉、梳理、总结数据分析实战中的python、oracle研发知识体系 2.欢迎点赞、关注、批评、指正,互三走起来,小手动起来! 文章目录 1.背景说明2.环境搭建2.1 参考链接2.2 `oracle`查询测试代码3.数据请求与插入3.1 `Oracle`建表语句3.2 `Python`代码实现3.3 效果示例4.问题链…

2024最新 Jenkins + Docker实战教程(二) - Jenkins相关配置

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

深入了解Nodejs模块机制

深入了解Nodejs模块机制 我们都知道Nodejs遵循的是CommonJS规范&#xff0c;当我们require(moduleA)时&#xff0c;模块是怎么通过名字或者路径获取到模块的呢&#xff1f;首先要聊一下模块引用、模块定义、模块标识三个概念。 1 CommonJS规范 1.1 模块引用 模块上下文提供…

操作符详解(上)(新手向)

操作符详解&#xff08;上&#xff09; 一&#xff0c;算术操作符&#xff08;双目操作符&#xff09;1:‘’,‘-’,‘*’2&#xff1a;‘/’&#xff0c;‘%’ 一&#xff0c;单目操作符1:‘’,‘-’2&#xff1a;‘!’3&#xff1a;‘&’4&#xff1a;‘*’5&#xff1a;…

c++(一)

c&#xff08;一&#xff09; C与C有什么区别命名空间使用 输入输出流引用指针和引用的区别定义拓展 函数重载例子测试函数重载原理 参数默认值什么是参数默认值注意 在c中如何引入c的库动态内存分配new、delete与malloc、free的区别&#xff1f; C与C有什么区别 <1>都是…

.NET 一款内部最新的免杀WebShell

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

释放Mac潜能,选择Magic Disk Cleaner for Mac

想要让Mac运行更加流畅、性能更加出色吗&#xff1f;那就选择Magic Disk Cleaner for Mac吧&#xff01; Magic Disk Cleaner for Mac v2.7.7激活版下载 这款软件是Mac用户的得力助手&#xff0c;它拥有强大的扫描和清理功能&#xff0c;能够迅速找出并删除硬盘上的无用文件和垃…

亲测使用frp获得访问者真实ip

怎么访问都只有127.0.0.1这个内网ip,获取不到访问者的真实ip 1.打开frp的配置文件(一般是frpc.toml&#xff0c;无需设置frps.toml) 在每一个tcp协议中添加 transport.proxyProtocolVersion "v2" 实例&#xff1a; # frpc.toml [[proxies]] name "web" …

Docker+nginx部署SpringBoot+vue前后端分离项目(保姆及入门指南)

前后分离项目部署 项目回顾工具上线准备1、win1.1、前端1.2、后端 2、linux环境2.1、安装docker2.2、安装docker compose2.3、编写Dockerfile文件2.4、编写docker-compose.yml文件2.5、修改application-pro.yml2.6、准备好nginx的挂载目录和配置2.7、部署后端服务 项目回顾 书…