面试经典 114. 二叉树展开为链表

  • 最近工作越来越难找,裁员越来越懂了,焦虑的睡不着,怎么办呢,只能刷面试题,卷死你们

  • 今天这个题目没刷过,我思考了半天才只能用暴力,后来苦思冥想才想出来简单的方法,废话不多说,上链接:https://leetcode.cn/problems/flatten-binary-tree-to-linked-list/description/?envType=study-plan-v2&envId=top-interview-150
    在这里插入图片描述

  • 做这个题目之前,首先你要知道两个知识点:

    • 什么是二叉树?
    • 什么是先序遍历?
  • 先回答第一个问题,什么是二叉树?这是一个数据结构,是一种常见的树状数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点,如上图。

  • 了解什么是二叉树,才能回答第二问题,什么是先序遍历?首先这是一种遍历整个二叉树的方法,先序遍历:按照左子树 -> 根节点 -> 右子树的顺序遍历二叉树

  • 好了,了解了这两个基础知识,现在就来解决这道题。

  • 这道题目的是让我们把一颗树转变成一个单向链表

  • 这不简单,最暴力的方法就是用数组,把先序遍历的节点都存储起来,然后再通过遍历数组把他们都连接在一起不就行了吗,代码如下:

func flatten(root *TreeNode)  {list := preorderTraversal(root)//遍历整个数组,将树变成单向链表for i := 1; i < len(list); i++ {prev, curr := list[i-1], list[i]prev.Left, prev.Right = nil, curr}
}//将节点按照先序遍历的方式存储到数组中
func preorderTraversal(root *TreeNode) []*TreeNode {list := []*TreeNode{}if root != nil {list = append(list, root)list = append(list, preorderTraversal(root.Left)...)list = append(list, preorderTraversal(root.Right)...)}return list
}
  • ok,运行倒是成功了,但是这个效率可太难了,面试的时候,遇到这个题,只用这种做法肯定不成,怎么办呢?
    在这里插入图片描述

  • 我仔细想了想有两个优化方向

    • 时间方面,我希望只遍历一遍整个树就能解决这个问题
    • 空间方面,我希望空间复杂度为o(1) 就能解决
  • 方向确定好了,怎么办呢?

  • 通过我聪明的脑瓜子,转了又转,我想到了

  • 先序遍历是 根 左 右,相当于每次右子树都在后面,那我们可以把右子树,放到左子树最右边那个节点下面,并且当前根节点根据需求改造就行。

  • 这么讲有点抽象,我们通过图来举例,假设如示例1:
    在这里插入图片描述

  • 如果 我们只关注 当前节点 1 的话,我们需要做三个操作

    • 找到左子树最右的节点
    • 将右子树放到左子树最右的节点的右边
    • ​将左子树放到当前节点的右边
  • 结果就如下图:
    在这里插入图片描述

  • 是不是发现突然好像解决了一大半了

  • ok,我们继续,运行到 2 节点,继续上面的三个操作,结果如下:
    在这里插入图片描述

  • 基本上,我们就变成了一个单向链表,剩下的节点就重复的遍历下去,直至结束

  • 代码如下:

func Solution114(root *TreeNode)  {//遍历整个二叉树for root != nil{//如果有左子树if root.Left != nil{//找到左子树的最右节点next := root.Leftpre := nextfor pre.Right != nil{pre = pre.Right}//将原来的右子树接到左子树的最右节点pre.Right = root.Rightroot.Left, root.Right = nil, next}//继续下一个节点root = root.Right}
}
  • 这个解法给我想出来之后,我感觉我整个人都升华了,我感觉自己太棒了,奖励一个大鸡腿嘻嘻

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

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

相关文章

【机器学习】激活函数:神经网络的灵魂

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 激活函数&#xff1a;神经网络的灵魂什么是激活函数?常见激活函数类型1. Sigmo…

深入了解 JMeter 中的响应断言

JMeter 是一个强大的性能测试工具&#xff0c;能够模拟大量用户并发访问网站或应用程序&#xff0c;以便测试其性能和稳定性。在进行性能测试时&#xff0c;我们需要对响应结果进行断言&#xff0c;以确保应用程序或网站的功能和性能符合预期。 JMeter 提供了一套丰富的响应断…

VINS-FUSION 优化-IMU预积分因子(二)

VINS-FUSION 优化-IMU预积分因子(一)完成了IMU预积分及对于优化变量的全部雅克比矩阵的推导,本文结合VINS-FUSION源码,完成优化-IMU预积分因子的使用。 一、IMU预积分因子雅克比 VINS-FUSION源码中将优化变量分组如下: 1.对i时刻优化变量的雅可比

8.0.32 mysql 配置主从数据库

配置前提&#xff1a; 两台服务器都需要安装同一版本的mysql数据库 我的版本是8.0.32 数据库参数修改 主数据库my.cnf(linux)或my.ini(win)配置&#xff1a; 这里需要注意&#xff1a;server-id必须唯一主从两个库必须要不一样 log_binmysql-bin server-id24 gtid-modeON …

chapter08-面相对象编程的三大特征——封装

1、基础介绍 对电视机的操作就是典型封装 封装的好处&#xff1a;隐藏实现细节&#xff1b;可以对数据进行验证 2、封装的实现 3、入门案例 altinsert&#xff0c;getter and setter&#xff0c;自动插入

生成式人工智能的未来之路:对话系统与自主代理的交汇与展望

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

RAS--APEI 报错解析流程(2)

RAS--APEI 报错解析流程(1) 除了APEI 中除了GHES会记录错误&#xff0c;在Post过程中的错误通常是通过BERT Table汇报 1.BERT Boot Error Record Table is used to report unhandled errors that occurred in a previous boot&#xff0c;it is reported as a ‘one-time polle…

HarmonyOS Next 省市区级联(三级联动)筛选框

效果图 完整代码 实例对象 export class ProvinceBean {id?: stringpid?: stringisSelect?: booleandeep?: objectextName?: stringchildren?: ProvinceBean[] }级联代码 import { MMKV } from tencent/mmkv/src/main/ets/utils/MMKV import { ProvinceBean } from ..…

基于 HTML+ECharts 实现智慧运维数据可视化大屏(含源码)

智慧运维数据可视化大屏&#xff1a;基于 HTML 和 ECharts 的实现 在现代企业中&#xff0c;运维管理是确保系统稳定运行的关键环节。随着数据量的激增&#xff0c;如何高效地监控和分析运维数据成为了一个重要课题。本文将介绍如何利用 HTML 和 ECharts 实现一个智慧运维数据可…

深入理解 Java NIO:ByteBuffer和MappedByteBuffer的特性与使用

目录 前言 ByteBuffer是什么 重要特点 分配缓冲区 读写模式切换 操作文本数据 操作基本数据类型 案例解析-循环输出数据 MappedByteBuffer是什么 MappedByteBuffer 的工作机制 刷盘时机 总结 前言 在深入学习 RocketMQ 这款高性能消息队列框架的源码时&#xff0c…

醒醒,别睡了...讲《数据分析pandas库》了—/—<1>

一、了解pandas No.1 Pandas 是 Python 语言的一个扩展程序库&#xff0c;用于数据分析&#xff0c;是一个强大的分析结构化数据的工具集&#xff0c;基础是Numpy库&#xff0c;可以去参考前面所讲的课。&#xff08;提供高性能的矩阵运算&#xff09; No.2 应用 &#xff1a;P…

vue上传Excel文件并直接点击文件列表进行预览

本文主要内容&#xff1a;用elementui的Upload 组件上传Excel文件&#xff0c;上传后的列表采用xlsx插件实现点击预览表格内容效果。 在项目中可能会有这样的需求&#xff0c;有很多种方法实现。但是不想要跳转外部地址&#xff0c;所以用了xlsx插件来解析表格&#xff0c;并展…

Docker安装kkFileView实现在线文件预览

kkFileView为文件文档在线预览解决方案,该项目使用流行的spring boot搭建,易上手和部署,基本支持主流办公文档的在线预览,如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频等等 官方文档地址:https://kkview.cn/zh-cn/docs/production.html 一、拉取镜像 do…

1 深度学习网络DNN

代码来自B站up爆肝杰哥 测试版本 import torch import torchvisiondef print_hi(name):print(fHi, {name}) if __name__ __main__:print_hi(陀思妥耶夫斯基)print("HELLO pytorch {}".format(torch.__version__))print("torchvision.version:", torchvi…

用在ROS2系统中保持差速轮方向不变的PID程序

在ROS 2中&#xff0c;为了保持差速轮机器人的方向不变&#xff0c;通常需要使用PID&#xff08;Proportional Integral Derivative&#xff09;控制器来控制机器人的角速度。PID控制器可以帮助调整机器人的角速度&#xff0c;以维持其朝向不变。 下面是一个简单的ROS 2节点示…

使用el-table的案例小结——包含跨页多选、双击行、分页器、编辑\删除行、动态根据分页生成序号

首先看一下业务需求 需要实现跨页多选&#xff0c;双击行的时候弹出编辑对话框&#xff0c;对每行可以进行编辑和删除&#xff0c;实现分页器。 如果还没在项目中配置element-plus的可以参考文章 从零开始创建vue3项目——包含项目初始化、element-plus、eslint、axios、router…

vue import from

vue import from 导入文件&#xff0c;从XXXX路径&#xff1b;引入文件 import xxxx from “./minins/resize” import xxxx from “./minins/resize.js” vue.config.js 定义 : resolve(src)&#xff1b;就是指src 目录 import xxxx from “/utils/auth” im…

【C++初阶】string类

【C初阶】string类 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;C&#x1f96d; &#x1f33c;文章目录&#x1f33c; 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 1.2 实际中 2. 标准库中的string类 2.1 string类 2.…

Web响应式设计———1、Grid布局

1、网格布局 Grid布局 流动网格布局是响应式设计的基础。它通过使用百分比而不是固定像素来定义网格和元素的宽度。这样&#xff0c;页面上的元素可以根据屏幕宽度自动调整大小&#xff0c;适应不同设备和分辨率。 <!DOCTYPE html> <html lang"en"> &l…

Mysql-索引视图

目录 1.视图 1.1什么是视图 1.2为什么需要视图 1.3视图的作用和优点 1.4创建视图 1.5更新视图 1.6视图使用规则 1.7修改视图 1.8删除视图 2.索引 2.1什么是索引 2.2索引特点 2.3索引分类 2.4索引优缺点 2.5创建索引 2.6查看索引 2.7删除索引 1.视图 1.1什么是…