图解LeetCode——114. 二叉树展开为链表

news/2024/11/2 4:26:41/

一、题目

给你二叉树的根结点 root ,请你将它展开为一个单链表:

展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。

展开后的单链表应该与二叉树 先序遍历 顺序相同。

二、示例

2.1> 示例 1:

输入】root = [1,2,5,3,4,null,6]
输出】[1,null,2,null,3,null,4,null,5,null,6]

2.2> 示例 2:

输入】root = []
输出】[]

2.3> 示例 3:

输入】root = [0]
输出】[0]

提示:

  • 树中结点数在范围 [0, 2000] 内
  • -100 <= Node.val <= 100

进阶:

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

三、解题思路

根据题目描述,需要我们根据给定的二叉树,然后对其进行先序遍历/前序遍历,从而拼装出一条链表。那么,首先我们先要弄清楚二叉树的遍历方式,我们以三个节点为例:nodeleftNoderightNode。遍历方式如下所示:

前序遍历node——>leftNode——>rightNode
中序遍历leftNode——>node——>rightNode
后序遍历leftNode——>rightNode——>node

那么,了解了先序遍历方式之后,就可以通过遍历一次二查树,将树节点TreeNode保存到List中,然后再针对List进行遍历操作,从而构造一条先序顺序的链表。

但是,我们从题目描述的“进阶”部分可以看到它的要求,即:你可以使用原地算法(O(1) 额外空间)展开这棵树吗? 那么我们就不能使用List来进行TreeNode的存储了。我们此时就需要每当遍历一个树节点就进行一次链表拼装操作。那怎么操作呢?

首先】创建两个指针,分别为遍历用的指针node,和指针node的前置指针preNode
其次】当preNode没有被初始化时,则preNode就指向node
第三】每当指针node遍历的下一个节点时,都是将preNode节点的right指向node节点,将preNode节点的left指向null;
第四preNode指针移动到node指针处,然后再重复第三步骤,直至整棵树遍历完毕;

上面就是本题的解题思路,为了方便理解,下面我们以root = [1,2,5,3,4,null,6]为例,看一下具体的处理过程是怎么样的。请见下图所示:

四、代码实现

class Solution {TreeNode preNode;public void flatten(TreeNode root) {if (root == null) return;TreeNode leftNode = root.left;TreeNode rightNode = root.right;if (preNode == null) preNode = root;else {preNode.right = root;preNode.left = null;preNode = root;}flatten(leftNode);flatten(rightNode);}
}
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」


http://www.ppmy.cn/news/221944.html

相关文章

PDF怎么转换成WORD?分享这几个方法给大家!

PDF怎么转换成Word&#xff1f;在我们的工作过程中&#xff0c;经常会使用到PDF文件、Word文件等等。而在很多时候&#xff0c;需要根据工作需求&#xff0c;将各种文件进行格式转换&#xff0c;例如将PDF文件转换成Word格式&#xff0c;从而满足我们对文件进行编辑、更改等需求…

3.完成ODS层数据采集操作

将原始数据导入mysql 1 选中mysql 运行脚本 2 验证结果 数据存储格式和压缩方案 存储格式 分类 1.行式存储(textFile) 缺点:可读性较好 执行 select * 效率比较高 缺点:耗费磁盘资源 执行 select 字段 效率比较低 2.列式存储(orc) 优点:节省磁盘空间. 执行 select 字段…

二次元播放器php源码,Miko动漫视频网站整站源码+二次元动漫网源码+视频弹幕网+自带播放器数据下载...

出现这个怎么办&#xff1f;&#xff1f;&#xff1f; Discuz! Database Error (1045) notconnect PHP Debug No.FileLineCode 1portal.php18discuz_application->init() 2source/class/discuz/discuz_application.php65discuz_application->_init_db() 3source/class/di…

【Qt学习】 设计视频播放器界面

目录 一&#xff1a;源码分享 二&#xff1a;QMessageBox弹窗类 三&#xff1a;视频播放器界面设计效果展示 一&#xff1a;源码分享 indexwin.h .cpp 【视频播放器界面】 #ifndef INDEXWIN_H #define INDEXWIN_H#include <QWidget> #include<QVBoxLayout>//垂直…

涵盖全网动漫、影视、小说的APP集合,手机有了他们,看遍全网

今天老猫给大家带来三款好用的APP。感觉老猫很久没有更新文章了&#xff0c;喜欢老猫的记得点赞评论转发支持老猫了哦~ 追书神器 小说软件中最强的一款&#xff0c;页面简洁&#xff0c;功能明确强大。拥有强大的搜索功能&#xff0c;能够迅速的查找全网的小说&#xff0c;而…

芒果tv视频播放器

浏览器版本和客户端视频画质差不多 电影 https://www.mgtv.com/b/364320/14275790.html https://pcweb.api.mgtv.com/player/video? did=cbb9b784-4116-4479-be92-dba92ca2830a &suuid=49b7e825-5cba-4abe-934d-c646425617f7 &cxid= &tk2=zkzN0kzN2UjNx0Ddpx2Y8…

vue开发的音乐小播放器

文章目录 简介NPM介绍本地应用Vue指令网络应用axios 天气案例音乐播放器 简介 VUE 官方文档观看进度 vue实例 对于生产环境&#xff0c;我们推荐链接到一个明确的版本号和构建文件&#xff0c;以避免新版本造成的不可预期的破坏&#xff1a; <script src"https://cd…