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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL连表查询练习

– 34. 查询所有员工的姓名和部门名称&#xff0c;没有部门的员工不需要展示 SELECTe.NAME 员工姓名,d.NAME 部门名称 FROMt_emp eINNER JOIN t_dept d ON e.dept_id d.id;– 35. 查询所有员工的姓名和部门名称&#xff0c;没有部门的员工展示BOSS SELECTe.NAME 员工姓名,i…

521源码-免费源码下载-在线变量命名工具前端源码-新手开发者工具

更多网站源码学习教程&#xff0c;请点击&#x1f449;-521源码-&#x1f448;获取最新资源 本工具地址&#xff1a;在线变量命名工具前端源码-新手开发者工具 - 521源码

活跃引进OA体系,打造“数字学校”

信息化建造高速开展的今日&#xff0c;越来越多的企事业单位开端自己重视工作办理&#xff0c;活跃引进OA体系来完善企业安排办理&#xff0c;进步企业协同工作功率。关于教育职业&#xff0c;OA工作体系有着绝佳的效果。如“数字学校”的打造。 数字化学校是使用计算机技能、网…

上海亚商投顾:沪指冲高回落 商业航天、AI PC概念全天强势

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数5月31日冲高回落&#xff0c;创业板指一度涨超1%&#xff0c;午后集体下行翻绿&#xff0c;黄白二线分…

Linux如何远程连接服务器?

远程连接服务器是当代计算机技术中一个非常重要的功能&#xff0c;在各种领域都有广泛的应用。本文将重点介绍如何使用Linux系统进行远程连接服务器操作。 SSH协议 远程连接服务器最常用的方式是使用SSH&#xff08;Secure Shell&#xff09;协议。SSH是一种网络协议&#xff…

揭露视频剪辑兼职的骗局

视频剪辑兼职骗局是近年来网络诈骗的一种常见形式&#xff0c;不法分子利用人们希望通过兼职赚取额外收入的心理&#xff0c;设下陷阱诱导受害者上当。下面将揭露这类骗局的常见手法和特点&#xff0c;以帮助大家识别和防范。 首先&#xff0c;骗子通常会以高收益、低门槛为诱饵…

JavaEE IO流(1)

1.什么是IO流 &#xff08;1&#xff09;input输入 Output输出 这两个的首字母就是IO的组成 &#xff08;2&#xff09;比如你的电脑可以通过网络上传文件和下载文件 这个上传文件就是Output 这个下载翁建就是input (3)这个输入和输出的标准是以CPU为参照物为基准的 其中通…

【全开源】旅游门票预订系统(FastAdmin+ThinkPHP+Uniapp)

一款基于FastAdminThinkPHPUniapp开发的旅游门票预订系统&#xff0c;支持景点门票、导游产品便捷预订、美食打卡、景点分享、旅游笔记分享等综合系统&#xff0c;提供前后台无加密源码&#xff0c;支持私有化部署。 ​便捷你的每一次出行&#x1f30d; &#x1f31f; 轻松预订…

Postman安装、汉化及禁止自动更新

&#x1f388;&#x1f388;&#x1f388;这里以9.12.2版本为例&#xff0c;因为汉化包最新的版本为9.12.2 下载安装包 历史版本下载&#xff1a; 请把下面链接的"版本号"替换为指定的版本号&#xff0c;例如&#xff1a;8.8.0 系统历史版本Windows64位https://dl…

【C++奇妙冒险】日期类Date的实现

文章目录 前言日期类Date的接口设计构造函数和打印函数获取日期并判断日期是否合法日期类的大小比较关系<运算符重载 判断小于运算符重载 判断相等<运算符重载 判断小于等于>运算符重载 判断大于> 运算符重载 判断大于等于! 运算符重载 不等于 日期类计算日期天数日…

Day07-Web案例

SELECT * FROM EMP OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY; SELECT COUNT(*) FROM EMP;

树莓派串口无法使用(排除硬件错误后)

1、串口 进入/boot文件夹下&#xff0c;打开cmdline.txt文件 cd /boot/sudo vi cmdline.txt 删除下方红框内字段

Docker 部署 mysql 服务

linux用法 Container&#xff08;容器&#xff09;集合成 Services&#xff08;服务&#xff09; 交互集合成 Stack&#xff08;堆栈&#xff09;卸载可能存在的旧版本 sudo apt-get update使apt可以通过HTTPS使用存储库&#xff08;repository&#xff09; sudo apt-get ins…

毕业论文写作新策略:如何有效利用AI写作?

写作这件事一直让我们从小学时期就开始头痛&#xff0c;初高中时期800字的作文让我们焦头烂额&#xff0c;一篇作文里用尽了口水话&#xff0c;拼拼凑凑才勉强完成。 大学时期以为可以轻松顺利毕业&#xff0c;结果毕业前的最后一道坎拦住我们的是毕业论文&#xff0c;这玩意不…

现货白银的交易时间有多连贯?

国际市场上的现货白银优势很多&#xff0c;它除了具备国内同类型品种所不具备的数十倍资金杠杆外&#xff0c;也基本上实现了全天24小时不间断的交易时间&#xff0c;所以投资者可以在全天候连贯的行情中&#xff0c;寻找属于自己的交易获利机会。 但对于内地的投资者来说&…

基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用

背景 随着互联网服务的广泛普及与技术应用的深入发展&#xff0c;日志数据作为记录系统活动、用户行为和业务操作的宝贵资源&#xff0c;其价值愈发凸显。然而&#xff0c;当前海量日志数据的产生速度已经远远超出了传统数据分析工具的处理能力&#xff0c;这不仅要求我们具备…

如何正确理解事件溯源架构模式?

在微服务架构盛行的当下&#xff0c;DDD&#xff08;领域驱动设计&#xff09;也得到了崭新的发展。同时&#xff0c;随着DDD的不断发展&#xff0c;也诞生了一些新的设计思想和开发模式&#xff0c;今天要介绍的事件溯源是其中具有代表性的一种模式。 事件溯源模式是DDD领域中…

复习kafka

Kafka 介绍 Kafka 是一种分布式的&#xff0c;基于发布/订阅的消息系统。它最初由 LinkedIn 开发&#xff0c;并于 2011 年开源。Kafka 的设计目标是提供一种高效、可靠的消息传输机制&#xff0c;能够处理大量的实时数据。 Kafka 基本概念 Producer&#xff1a;生产者&#xf…

告别复制粘贴:AI辅助毕业论文写作全攻略

写作这件事一直让我们从小学时期就开始头痛&#xff0c;初高中时期800字的作文让我们焦头烂额&#xff0c;一篇作文里用尽了口水话&#xff0c;拼拼凑凑才勉强完成。 大学时期以为可以轻松顺利毕业&#xff0c;结果毕业前的最后一道坎拦住我们的是毕业论文&#xff0c;这玩意不…

vue配置代理服务器解决跨域方法

一.vue配置代理服务器解决跨域方法一 过程如图&#xff1a; 1.在配置文件中设置代理服务器的地址 //vue.config.js module.exports{pages:{index:{// 入口entry:src/main.js,},},lintOnSave:false, //关闭语法检测// 开启代理服务器devServer:{proxy:http://localhost:8000//…