Leetcode力扣秋招刷题路-0114

news2024/9/25 3:23:19

从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结

114. 二叉树展开为链表(Mid)

  • 给你二叉树的根结点 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

  • 进阶: 你可以使用原地算法(O(1) 额外空间)展开这棵树吗?

  • 解法一: 可以发现展开的顺序其实就是二叉树的先序遍历。

    • 将左子树插入到右子树的地方
    • 将原来的右子树接到左子树的最右边节点
    • 考虑新的右子树的根节点,一直重复上边的过程,直到新的右子树为 null

    可以看图理解下这个过程。

        1
       / \
      2   5
     / \   \
    3   4   6
    
    //将 1 的左子树插入到右子树的地方
        1
         \
          2         5
         / \         \
        3   4         6        
    //将原来的右子树接到左子树的最右边节点
        1
         \
          2          
         / \          
        3   4  
             \
              5
               \
                6
                
     //将 2 的左子树插入到右子树的地方
        1
         \
          2          
           \          
            3       4  
                     \
                      5
                       \
                        6   
            
     //将原来的右子树接到左子树的最右边节点
        1
         \
          2          
           \          
            3      
             \
              4  
               \
                5
                 \
                  6         
    
    
    
    public void flatten(TreeNode root) {
        while (root != null) { 
            //左子树为 null,直接考虑下一个节点
            if (root.left == null) {
                root = root.right;
            } else {
                // 找左子树最右边的节点
                TreeNode pre = root.left;
                while (pre.right != null) {
                    pre = pre.right;
                } 
                //将原来的右子树接到左子树的最右边节点
                pre.right = root.right;
                // 将左子树插入到右子树的地方
                root.right = root.left;
                root.left = null;
                // 考虑下一个节点
                root = root.right;
            }
        }
    }
    
  • 解法二:右左中递归遍历

    private TreeNode pre = null;
    
    public void flatten(TreeNode root) {
        if (root == null)
            return;
        flatten(root.right);
        flatten(root.left);
        root.right = pre;
        root.left = null;
        pre = root;
    }
    
    

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

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

相关文章

Linux- 系统随你玩之--文本、字符串处理摸金校尉--RE

文章目录1、前言2、正则表达式2.1、 概述2.2、 特点2.3、正则表达式-测试工具3、知识点3.1、 正则表达式定义3.2、 正则表达式的组成3.3、正则表达式语法支持情况4、速记理解技巧4.1、基础正则表达式4.2、等价4.3、常用运算符与表达式4.4、分割语法4.4.1、例型4.4.2、例型语法与…

Java高手速成 | JSP MVC模式项目案例

MVC模式的核心思想是有效地组合“视图”“模型”和“控制器”。在JSP 技术中&#xff0c;视图是一个或多个JSP页面&#xff0c;其作用主要是向控制器提交必要的数据和为模型提供数据显示&#xff1b;模型是一个或多个Javabean对象&#xff0c;用于存储数据&#xff1b;控制器是…

LifeCycle源码解析

简介 Lifecycle是Jetpack中的一个生命周期组件&#xff0c;可用来感知其他组件&#xff08;如Activity&#xff0c;Fragment&#xff09;生命周期的变化&#xff0c;从而可以保证我们的一些代码操作控制在合理的生命周期内&#xff1b; 如何使用&#xff1f; 添加以下依赖 …

什么是接口、接口测试、接口自动化测试、你分的清楚吗?

目录 前言&#xff1a; 服务端接口测试介绍 什么是服务端&#xff1f; 什么是接口&#xff1f; 什么是接口测试&#xff1f; 为什么要做接口测试&#xff1f; 如何做接口测试&#xff1f; 接口测试自动化介绍 为什么是接口测试自动化&#xff1f; 为什么要做接口测试自…

什么是动态域名解析?域名怎么解析到内网IP

首先说说什么是域名解析&#xff0c;域名解析就是把域名解析成一个ip地址&#xff0c;我们大多数人都喜欢记忆域名&#xff0c;但是机器只认识IP地址&#xff0c;把这个IP地址对应相关域名&#xff0c;这就叫域名解析。动态域名与动态域名解析是相互关联的关系&#xff0c;通过…

项目图床选择

总结&#xff1a; 非隐私图片&#xff1a;使用Github、七牛云(http)、SM.MS图床、路过图床。隐私图片&#xff1a;使用阿里云OSS、七牛云(https)&#xff08;绑定的域名不能丢&#xff09;。 测试环境&#xff08;日常使用&#xff09;自行选择&#xff1b; 生产环境选择阿里云…

03_PyTorch 模型训练[Dataset 类读取数据集]

PyTorch 读取图片&#xff0c;主要是通过 Dataset 类&#xff0c;所以先简单了解一下 Dataset 类。Dataset 类作为所有的 datasets 的基类存在&#xff0c;所有的 datasets 都需要继承它&#xff0c;类似于 C中的虚基 类。这里重点看 getitem 函数&#xff0c;getitem 接收一个…

微信小程序使用canvas生成分享海报功能复盘

前言 近期需要开发一个微信小程序生成海报分享的功能。在h5一般都会直接采用 html2canvas 或者 dom2image 之类的库直接处理。但是由于小程序不具备传统意义的dom元素&#xff0c;所以也没有办法采用此类工具。 所以就只能一笔一笔的用 canvas 画出来了&#xff0c;下面对实现…

(文末有彩蛋,不看白不看)兑现一下之前答应读者的事

大家过年好呀&#xff01;&#xff08;我&#xff09;明天就要开工上班啦&#xff01;在假期的最后一天踢了会球&#xff0c;简单吃点东西&#xff0c;晚上来兑现答应一位读者的事情。开整&#xff01; 前情提要 这篇文章缘起于「开发者」技术交流群中一位读者遇到的问题&…

《树上的男爵》坚持解释不清的理想是疏离,还是自由?

《树上的男爵》坚持解释不清的理想是疏离&#xff0c;还是自由&#xff1f; 伊塔洛卡尔维诺&#xff0c;意大利作家&#xff0c;后现代主义派。 卡尔维诺为“寓言式奇幻文学的大师”。&#xff08;评论家赫伯特密特甘评&#xff09; 吴正仪 译 许多年来&#xff0c;我为一些连我…

【3】SpringBoot基础

//从事微服务开发工作 SpringBoot提供一种快速使用Spring的方式 1、自动化 2、设置多个starter配置依赖比Maven直接管理更便捷 3、内置服务器 总结&#xff1a;自动配置&#xff0c;起步依赖&#xff0c;辅助功能 2.6.11版本的说明书 Spring Boot Reference Documentation…

第九层(8):STL之set/multiset

文章目录前情回顾set/multiset概念区别构造函数赋值函数大小操作函数交换函数插入函数删除函数查找函数统计函数为什么set不可以插入重复数据pair数组pair数组创建怎么样去改变set容器的排序规则下一座石碑&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;一名大一…

智公网:一级消防师要掌握的知识点!

一、建筑物的耐火等级 1、建筑物的耐火等级分为四级&#xff0c;一、二、三、四级。 2、节点缝隙或金属承重构件节点的外露部位&#xff0c;应做防火保护层。 3、民用建筑的耐火等级、层数、长度和面积&#xff0c;一二级最大防火分区的长度250m。多层建筑最大允许建筑面积2…

【gcc/g++/gdb/cmake】命令

文章目录参考资料一、gcc/g/make1 gcc和g的区别2 gcc/g与make区别3 make与cmake区别二、开发环境搭建1 编译器&#xff0c;调试器&#xff0c;CMake安装2 GCC编译器2.1 编译过程2.1.1 -E 预处理-Pre-Processing .i文件2.1.2 -S 编译-Compiling .s文件2.1.3 -C 汇编-Assembling …

软件工程(二)——需求工程、统一建模语言UML

目录 一、需求获取 二、需求分析 1.结构化需求分析 2.面向对象分析方法OOA 三、UML 41视图 四、UML 图 (1)用例图 (2)类图、对象图 (3)顺序图 &#xff08;4&#xff09;活动图 &#xff08;5&#xff09;状态图 &#xff08;6&#xff09;通信图 软件需求指用户对系…

【科研】ET-BERT代码分析

0. 数据集 论文使用的TLS1.3数据集是从 2021 年 3 月到 2021 年 7 月在中国科技网 (CSTNET) 上收集的。 如果要使用自己的数据集的话&#xff0c;需要检查数据格式是否与datasets/cstnet-tls1.3/目录下一致&#xff0c;并且在data_process/目录下指定数据集路径。 用于微调的…

Pomotroid 使用指南:一款高颜值 PC 端番茄时钟

文章首发于个人公众号&#xff1a;「阿拉平平」 番茄工作法作为一套高效易行的时间管理方案&#xff0c;是由意大利人弗朗西斯科西里洛于 1992 年创立的。作者发明的初衷源自于自身严重的拖延症&#xff0c;于是他找来一个厨房用的番茄计时器&#xff0c;调到 10 分钟&#xff…

游戏SDK(二)框架设计

前言 根据上一篇游戏SDK&#xff08;一&#xff09; 客户端整体架构&#xff0c;介绍了游戏SDK 及 游戏SDK的需求分析。根据需求分析&#xff0c;对游戏SDK的设计分为3大块&#xff1a; 客户端&#xff1a;接口统一&#xff0c;做好逻辑转发和处理。具体渠道具体实现&#xf…

【高并发】- 生产级系统搭建 - 4

前言 关于高并发系统中&#xff0c;当前比较热门的还是属于“秒杀”系统&#xff0c;前面章节在整理了“秒杀”系统的相关设计概念后&#xff0c;本章节&#xff0c;来讲解扣减库存相关的业务逻辑。 1 库存的那些事 一般电商网站中&#xff0c;购买流程一般都是这样的&#xff…

多线程之Callable接口、ReentrantLock、信号量 Semaphore以及CountDownLatch

目录&#xff1a;一、Callable接口Callable的用法小结二、ReentrantLockReentrantLock 的用法ReentrantLock 和 synchronized 的区别&#xff1f;为什么有了 synchronized 还需要 juc(java.util.concurrent) 下的 lock&#xff1f;三、信号量 Semaphore如何理解信号量&#xff…