面试经典 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.xdnf.cn/news/1488320.html

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

相关文章

【音视频】RTSP、RTMP与流式传输

文章目录 前言RTSP与RTMPRTSP&#xff08;Real-Time Streaming Protocol&#xff09;RTMP&#xff08;Real-Time Messaging Protocol&#xff09;主要差异 什么是流式传输&#xff1f;流式传输的特点流式传输与传统下载的区别 使用VLC播放RTSP监控 总结 前言 在现代网络环境中…

uni-app声生命周期

应用的生命周期函数在App.vue页面 onLaunch:当uni-app初始化完成时触发&#xff08;全局触发一次&#xff09; onShow:当uni-app启动&#xff0c;或从后台进入前台时显示 onHide:当uni-app从前台进入后台 onError:当uni-app报错时触发,异常信息为err 页面的生命周期 onLoad…

html+css+js前端作业 王者荣耀官网5个页面带js

htmlcssjs前端作业 王者荣耀官网5个页面带js 下载地址 https://download.csdn.net/download/qq_42431718/89574989 目录1 目录2 目录3 项目视频 王者荣耀5个页面&#xff08;带js&#xff09; 页面1 页面2 页面3 页面4 页面5

四步实现网站HTTPS访问

随着网络安全的重要性日益凸显&#xff0c;HTTPS&#xff08;超文本传输安全协议&#xff09;已成为现代网站的标准配置。HTTPS协议作为HTTP协议的安全版本&#xff0c;通过SSL协议加密数据传输&#xff0c;不仅能保护用户数据的安全&#xff0c;还能提升搜索引擎排名&#xff…

07-workqueue

想系统学习k8s源码&#xff0c;云原生的可以加&#xff1a;mkjnnm 今天我们来详细研究下 workqueue 相关代码。client-go 的 util/workqueue 包里主要有三个队列&#xff0c;分别是普通队列&#xff0c;延时队列&#xff0c;限速队列&#xff0c;后一个队列以前一个队列的实现为…

Java基础巩固——JDK 8、9新增接口的特性(接口中定义非抽象方法、静态方法和私有方法)

#Java学了这么久&#xff0c;项目也做了&#xff1f;基础知识还不巩固&#xff1f;快来关注我的这篇系列博客——Java基础复习巩固吧# 目录 引言 一、JDK8新特性&#xff1a;允许在接口中定义非抽象方法和静态方法。 注意事项 二、JDK9新特性&#xff1a;允许在接口中定义p…

“科技创新‘圳’在变革”2025深圳电子展

电子产业作为现代社会的核心驱动力之一&#xff0c;正以前所未有的速度发展。在这样的背景下&#xff0c;深圳作为中国的经济特区和创新高地&#xff0c;又一次迎来了备受瞩目的盛会——2025深圳电子展览会。本次展览会定于2025年4月9日至11日&#xff0c;在深圳会展中心&#…

Photos框架 - 自定义媒体资源选择器(数据部分)

引言 在iOS开发中&#xff0c;系统已经为我们提供了多种便捷的媒体资源选择方式&#xff0c;如UIImagePickerController和PHPickerViewController。这些方式不仅使用方便、界面友好&#xff0c;而且我们完全不需要担心性能和稳定性问题&#xff0c;因为它们是由系统提供的&…

Java Selenium WebDriver:代理设置与图像捕获

在网络爬虫和自动化测试领域&#xff0c;Selenium WebDriver 是一个非常流行的工具&#xff0c;它允许开发者模拟用户在浏览器中的操作。然而&#xff0c;出于安全或隐私的考虑&#xff0c;有时我们需要通过代理服务器来发送请求。本文将介绍如何在Java环境中使用Selenium WebD…

MSQP Mysql数据库权限提升工具,UDF自动检测+快速反向SHELL

项目地址:https://github.com/MartinxMax/MSQP MSQP 这是一个关于Mysql的权限提升工具 安装依赖 $ python3 -m pip install mysql-connector-python 使用方法 $ python3 msqp.py -h 权限提升:建立反向Shell 在建立反向连接前,该工具会自动检测是否具有提权条件&#xff0…

01。配置DevEcoStudio的中文界面方法

打开项目 点击File >> 点击Setting &#xff08;或者按快捷键 Ctrl alt S&#xff09; 选择 Plugins &#xff08;扩展&#xff09;>> 输入 chinese >>点击 Enable 点击 apply >OK 弹出窗口点击 Restart finish&#xff08;完成&#xff09;hiahia…

文件共享功能无法使用提示错误代码0x80004005【笔记】

环境情况&#xff1a; 其他电脑可以正常访问共享端&#xff0c;但有一台电脑访问提示错误代码0x80004005。 处理检查&#xff1a; 搜索里输入“启用或关闭Windows功能”按回车键&#xff0c;在“启用或关闭Windows功能”里将“SMB 1.0/CIFS文件共享支持”勾选后&#xff08;故…

hipBLAS示例程序

GPT-4o (OpenAI) 当然&#xff01;以下是一个简单示例&#xff0c;展示了如何使用hipBLAS库进行矩阵-向量乘法 (GEMV) 的操作。该示例包括初始化 hipBLAS 环境&#xff0c;设置矩阵和向量数据并调用hipBLAS API来执行操作。 首先&#xff0c;确保你已经安装了 ROCm&#xff08…

【Web】LitCTF 2024 题解(全)

目录 浏览器也能套娃&#xff1f; 一个....池子&#xff1f; 高亮主题(划掉)背景查看器 百万美元的诱惑 SAS - Serializing Authentication exx 浏览器也能套娃&#xff1f; 随便试一试&#xff0c;一眼ssrf file:///flag直接读本地文件 一个....池子&#xff1f; {…

政安晨【零基础玩转各类开源AI项目】基于Ubuntu系统部署MimicMotion :利用可信度感知姿势指导生成高质量人体运动视频

目录 项目介绍 项目相关工作 图像/视频生成的扩散模型 姿势引导的人体动作转移 生成长视频 方法实践 与最先进方法的比较 消融研究 部署验证 1. 下载项目&#xff1a; 2. 建立环境 3. 下载参数模型 A. 下载 DWPose 预训练模型&#xff1a;dwpose B. 从 Huggingfa…

redis的使用场景

目录 1. 热点数据缓存 1.1 什么是缓存&#xff1f; 1.2 缓存的原理 1.3 什么样的数据适合放入缓存中 1.4 哪个组件可以作为缓存 1.5 java使用redis如何实现缓存功能 1.5.1 需要的依赖 1.5.2 配置文件 1.5.3 代码 1.5.4 发现 1.6 使用缓存注解完成缓存功能 2. 分布式锁…

从0到1:理发店预约剪发小程序开发笔记(上)

背景 理发师可以在小程序上设置自己的可预约时间&#xff0c;价格&#xff0c;自我介绍&#xff0c;顾客可以根据理发师的日程安排选择合适的时间进行预约和支付。这样可以提高预约的效率&#xff0c;减少沟通成本&#xff0c;方便双方的安排。 功能规划 首页展示&#xff1…

【CPS出版】2024年智能计算与数据分析国际学术会议(ICDA 2024,9月6日-8)

为探讨数据科学和计算智能领域的关键问题&#xff0c;促进相关交流&#xff0c;2024年智能计算与数据分析国际学术会议&#xff08;ICDA 2024)将于2024年9月6日-8日在中国青岛召开。 本届会议拟邀请数据分析和计算智能领域的顶级专家、学者和产业界优秀人才&#xff0c;围绕当前…

【音视频之SDL2】bmp图片与绘制bmp

文章目录 前言BMP是什么SDL2绘制BMP的原理SDL2绘制BMP的流程SDL_LoadBMP作用函数原型参数返回值示例代码 SDL_BlitSurface作用函数原型参数返回值 示例代码效果展示总结 前言 在现代多媒体应用中&#xff0c;图像的处理和显示是非常重要的一部分。无论是在游戏开发还是在视频处…

腾讯QQ临时对话框功能取消免费使用,替代的是腾讯推出的“企点客通”模块实现,买通服务即可实现

最近遇到一个项目有这么一个业务&#xff1a; 要实现的功能是&#xff1a;QQ在线咨询 想要实现的效果如图所示&#xff1a; 按照以往的开发经验使用的是直接使用以下代码&#xff1a; <a target"_blank" href"tencent://message/?uin2104*****57(QQ号)&am…