Leetcode力扣秋招刷题路-0114

news/2025/2/22 18:33:40/

从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.ppmy.cn/news/20887.html

相关文章

测牛学堂:软件测试开发python入门之list列表详解(一)

1列表详解 列表&#xff0c;在python中是list&#xff0c;使用[] 注意&#xff1a; 1 列表可以存放任意多的数据 2 列表中可以存放任意类型的数据 3 列表中数据之间&#xff0c;使用逗号分隔 列表的定义方式 1 使用list进行定义。list定义列表&#xff0c;也称为数据类型转换。…

MyBatisPlus入门

文章目录MyBatisPlus1&#xff0c;MyBatisPlus入门案例与简介1.1 入门案例步骤1:创建数据库及表步骤2:创建SpringBoot工程步骤3:勾选配置使用技术步骤4:pom.xml补全依赖步骤5:添加MP的相关配置信息步骤6:根据数据库表创建实体类步骤7:创建Dao接口步骤8:编写引导类步骤9:编写测试…

Linux常用的一些实战脚本(持续更新)

目录 一&#xff1a;根据PID过滤进程所有信息 二&#xff1a;根据进程名过滤进程信息 三&#xff1a;根据用户名查询该用户的相关信息 四&#xff1a;加固系统的一些配置 五&#xff1a;实现磁盘分区的 六&#xff1a;使用一整块硬盘创建逻辑卷 七&#xff1a;将一块硬盘…

【授权与认证】OAuth 2.0 和 OIDC 的异同点

开发者谈 | OAuth 2.0 和 OIDC 协议的关系&#xff1f;&#xff08;内含必看案例&#xff09; 【Web 安全】CSRF 攻击详解 OAuth 2.0 OAuth 2.0 的一个简单解释OAuth 2.0 的四种方式什么是Oauth2.0&#xff0c;Oauth2.0的四种授权模式 简单说&#xff0c;OAuth 就是一种授权…

Java多线程案例之线程池

一. 线程池概述 1. 什么是线程池 线程池和和字符串常量池, 数据库连接池一样, 都是为了提高程序的运行效率, 减少开销; 随着并发程度的提高, 当我们去频繁的创建和销毁线程, 此时程序的开销还是挺大的, 为了进一步提高效率, 就引入了线程池, 程序中所创建的线程都会加载到一个…

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

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

正大国际期货:外盘短线交易九大生存准则:从亏损预期出发

一、生存是第一位 这并不是陈词滥调&#xff0c;投机是非常危险的活动。投机非并输赢那样简单&#xff0c;首要的任务是在顶峰和谷底之间的波动中生存&#xff0c;如果连生存都做不到&#xff0c;你根本就没有谈及赢的资格。 即使有了好的资金管理、正确的系统和行动的前提&a…

【JavaScript】原型链

文章目录构造函数原型对象访问机制内置构造函数一切皆对象原型链构造函数 - 本质还是一个函数- 和 new 关键字连用- 特点1. 自动创建一个对象2. 自动返回一个对象3. 让函数的this指向这个对象 书写构造函数的时候1. 属性写在函数内2. 方法写在原型上构造函数的不合理 把方法写在…