LeetCode题练习与总结:二叉树展开为链表--114

一、题目描述

给你二叉树的根结点 root ,请你将它展开为一个单链表:

  • 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
  • 展开后的单链表应该与二叉树 先序遍历 顺序相同。

示例 1:

输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [0]
输出:[0]

提示:

  • 树中结点数在范围 [0, 2000] 内
  • -100 <= Node.val <= 100

二、解题思路

  1. 将根节点的左子树和右子树拉平。
  2. 将拉平后的左子树作为右子树,将原来的右子树接到当前右子树的末端。

三、具体代码

class Solution {public void flatten(TreeNode root) {if (root == null) {return;}flatten(root.left);flatten(root.right);TreeNode left = root.left;TreeNode right = root.right;root.left = null;root.right = left;TreeNode p = root;while (p.right != null) {p = p.right;}p.right = right;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 对于每个节点,我们首先递归地展平其左子树,这需要 O(left) 的时间,其中 left 是左子树中的节点数。
  • 然后,我们递归地展平其右子树,这需要 O(right) 的时间,其中 right 是右子树中的节点数。
  • 最后,我们将左子树移动到右子树的位置,并找到新的右子树的末端以连接原始的右子树。这个操作需要 O(left) 的时间。
  • 因此,对于每个节点,我们在最好情况下(没有子节点)需要 O(1) 时间,在最坏情况下(左右子树都有)需要 O(left + right) 时间。
  • 由于每个节点只被访问一次,整体时间复杂度是 O(n),其中 n 是树中节点的总数。
2. 空间复杂度
  • 空间复杂度主要取决于递归栈的深度,这通常与树的高度成正比。
  • 在最坏的情况下,树完全不平衡,例如每个节点都只有左子节点,递归栈的深度将是 O(n),其中 n 是树中节点的总数。
  • 在最好的情况下,树是完全平衡的,递归栈的深度将是 O(log n)。
  • 因此,空间复杂度在最坏情况下是 O(n),在最好情况下是 O(log n)。

五、总结知识点

  1. 递归:这是一种常用的算法设计技巧,用于将复杂问题分解为更小的子问题。在这个问题中,我们使用递归将树的展平问题分解为子树的展平问题。

  2. 二叉树遍历:代码中隐式地使用了先序遍历(根-左-右)的顺序来展平二叉树。这是通过递归调用 flatten(root.left) 和 flatten(root.right) 实现的。

  3. 链表操作:展平二叉树的过程中,我们需要将左子树转换为链表,并将其连接到根节点的右侧,然后将原始的右子树连接到转换后的左子树的末端。这涉及到链表的基本操作,如节点的移动和连接。

  4. 指针操作:在 Java 中,我们使用 TreeNode 类型的变量来操作树节点。这些变量实际上是指向树中节点的指针。代码中使用了这些指针来修改节点的左右子节点。

  5. 边界条件处理:代码中首先检查 root 是否为 null,这是递归算法的边界条件。如果 root 为 null,则直接返回,不再进行递归。

  6. 引用传递:在 Java 中,对象是通过引用传递的。这意味着当我们在递归调用中传递 root.left 和 root.right 时,我们实际上是在传递对树节点对象的引用。因此,在递归调用中对这些节点所做的任何修改都会反映到原始树上。

  7. 循环结构:在将左子树移动到右子树位置后,我们使用了一个循环结构来找到新的右子树的末端,以便将原始的右子树连接起来。

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

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

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

相关文章

深入探讨Java字符串拼接的艺术

引言 在Java编程中&#xff0c;字符串是最基本的数据类型之一。字符串拼接是开发过程中一个非常常见的操作&#xff0c;无论是构建用户界面的文本&#xff0c;还是生成日志信息&#xff0c;都离不开字符串的拼接。然而&#xff0c;字符串拼接的效率和正确性常常被开发者忽视&a…

格式化数据恢复指南:从备份到实战,3个技巧一网打尽

朋友们&#xff01;你们有没有遇到过那种“啊&#xff0c;我的文件呢&#xff1f;”的尴尬时刻&#xff1f;无论是因为手滑、电脑抽风还是其他原因&#xff0c;数据丢失都可能会让我们抓狂&#xff0c;甚至有时候&#xff0c;我们可能一不小心就把存储设备格式化了&#xff0c;…

香橙派OrangePI AiPro测评 【运行qt,编解码,xfreeRDP】

实物 为AI而生 打开盒子 配置 扛把子的 作为业界首款基于昇腾深度研发的AI开发板&#xff0c;Orange Pi AIpro无论在外观上、性能上还是技术服务支持上都非常优秀。采用昇腾AI技术路线&#xff0c;集成图形处理器&#xff0c;拥有8GB/16GB LPDDR4X&#xff0c;可以外接32…

进程通信——管道

什么是进程通信&#xff1f; 进程通信是实现进程间传递数据信息的机制。要实现数据信息传递就要进程间共享资源——内存空间。那么是哪块内存空间呢&#xff1f;进程间是相互独立的&#xff0c;一个进程不可能访问其他进程的内存空间&#xff0c;那么这块空间只能由操作系统提…

什么是RPA自动化办公?

RPA自动化办公&#xff1a;提升效率的利器 如今&#xff0c;自动化办公已成为提升效率、减少错误、节省成本的关键手段。RPA&#xff08;机器人流程自动化&#xff0c;Robotic Process Automation&#xff09;作为其中的重要组成部分&#xff0c;正受到越来越多企业的青睐。那…

【全开源】简单商城系统源码(PC/UniAPP)

提供PC版本、UniAPP版本(高级授权)、支持多规格商品、优惠券、积分兑换、快递鸟电子面单、支持移动端样式、统计报表等 提供全部前后台无加密源代码、数据库离线部署。 构建您的在线商店的基石 一、引言&#xff1a;为什么选择简单商城系统源码&#xff1f; 在数字化时代&am…

【Spring Cloud Alibaba】初识Spring Cloud Alibaba

目录 回顾主流的微服务框架Spring Cloud 版本简介Spring Cloud以往的版本发布顺序排列如下&#xff1a; 由停更引发的"升级惨案"哪些Netflix组件被移除了&#xff1f; 替换方案服务注册中心&#xff1a;服务调用&#xff1a;负载均衡&#xff1a;服务降级&#xff1a…

Python—面向对象小解(6)-闭包、装饰器

一、闭包 在Python中&#xff0c;闭包&#xff08;closure&#xff09;是一个函数对象&#xff0c;即使在其词法作用域外被调用&#xff0c;它仍然能访问该作用域内的变量。闭包通过“捕获”周围作用域的变量&#xff0c;保持这些变量的状态&#xff0c;即使在外部函数已经返回…

干货分享 | TSMaster 中 Hex 文件编辑器使用详细教程

TSMaster 软件的 Hex 文件编辑器提供了文件处理的功能&#xff0c;这一特性让使用 TSMaster 软件的用户可以更便捷地对 Hex、bin、mot、s19 和 tsbinary 类型的文件进行处理。 本文重点讲述 TSMaster 中 Hex 文件编辑器的使用方法&#xff0c;该编辑器能实现将现有的 Hex、bin、…

@vue-office/excel 解决移动端预览excel文件触发软键盘

先直接上代码 不耽误大家时间 标明下插件库 非常感谢作者提供预览插件 vue-office/excel 只需要控制CSS :deep(.x-spreadsheet-overlayer) {.x-spreadsheet-selectors {display: none !important;} } :deep(.x-spreadsheet-bottombar) {li.active {user-select: none !import…

家政上门系统源码,家政上门预约服务系统开发涉及的主要功能

家政上门预约服务系统开发是指建立一个在线平台或应用程序&#xff0c;用于提供家政服务的预约和管理功能。该系统的目标是让用户能够方便地预约各种家政服务&#xff0c;如保洁、家庭护理、月嫂、家电维修等&#xff0c;并实现服务供应商管理和订单管理等功能。 以下是开发家政…

Windows API 速查

Windows API 函数大全 (推荐)&#xff1a;https://blog.csdn.net/xiao_yi_xiao/article/details/121604742Windows API 在线参考手册&#xff1a;http://www.office-cn.net/t/api/index.html?web.htmWindows 开发文档 (官方)&#xff1a;https://learn.microsoft.com/zh-cn/wi…

linux驱动学习(三)之uboot与内核编译

需要板子一起学习的可以这里购买&#xff08;含资料&#xff09;&#xff1a;点击跳转 GEC6818内核源码下载&#xff1a;点击跳转 一、环境配置 由于GEC6818对应是64位系统&#xff0c;虚拟机中的linux系统也要是64位&#xff0c;比如&#xff1a;ubuntu16.04.rar …

Bee 支持 与 mybatis-plus 混用吗?

Bee 支持 与 mybatis-plus 混用吗&#xff1f; 你是在什么场景下要混用呢? mybatis-plus是基于mybatis. 而Bee本身就是一个ORM框架了. Hibernate/MyBatis plus Sharding JDBC Jpa Spring data GraphQL App ORM (Android, 鸿蒙) Bee Bee支持的数据库 1.MySQL 2.Oracle 3.SQL…

elasticsearch的常规操作--增删改查和批量处理

1、_cat 查询 GET /_cat/nodes&#xff1a; 查看所有节点 GET /_cat/health&#xff1a; 查看es 健康状况 GET /_cat/master&#xff1a; 查看主节点 GET /_cat/indices&#xff1a;查看所有索引show databases; 2、索引一个文档&#xff08;保存&#xff09; 保存一个数据&…

某红书旋转滑块验证码分析与协议算法实现(高通过率)

文章目录 1. 写在前面2. 接口分析3. 验证轨迹4. 算法还原 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致…

力扣SQL50 学生们参加各科测试的次数 查询 三表查询

Problem: 1280. 学生们参加各科测试的次数 &#x1f468;‍&#x1f3eb; 参考题解 join等价于inner join&#xff0c;不用关联条件的join等价于cross join Code select stu.student_id,stu.student_name, sub.subject_name,count(e.subject_name) attended_exams from Stud…

关于windosw打开安全中心空白的解决方案

关于windosw打开安全中心空白的解决方案 问题如下 问题如下 之后点击一片空白 解决方案如下 按下WINR&#xff0c;输入regedit回车找到路径&#xff1a;“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SecurityHealthService”&#xff0c;然后双击右边的“start”…

【最新鸿蒙应用开发】——关系型数据库简单上手(RDB)

关系型数据库&#xff08;RDB&#xff09; 关系型数据库&#xff08;Relational Database&#xff0c;RDB&#xff09;是一种基于关系模型来管理数据的数据库。关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制&#xff0c;对外提供了一系列的增、删、改…

【cocos sreator】判定多边形和多边形相交

核心代码&#xff1a; cc.Intersection.polygonPolygon(points2, points) 拖拽物品拖到多个目标位置判定&#xff0c;取最近的&#xff1a; getTargetItem(collider2: cc.PolygonCollider, touchPos: cc.Vec2, targetRoot: cc.Node) {let length 99999;let target null;//col…