当前位置:网站首页>Leetcode——利用先序遍历特性完成114. 二叉树展开为链表
Leetcode——利用先序遍历特性完成114. 二叉树展开为链表
2022-08-04 11:06:00 【lonelyMangoo】
题目:114. 二叉树展开为链表
这道题很有意思,因为评论区各种递归实在看不懂过,直到看到一条利用二叉树特性的完成的评论,就自己模仿完成,就记录并分享一下。
思路一:重新建树
思路:用链表记录所有的节点,然后设置。这里一定要保存节点,因为这道题要求修改原来的root,而不是创建新的节点。
public void flatten(TreeNode root) {
//先序遍历+建树
if(root==null) return ;
List<TreeNode> buildList = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
// 先序中 左右,所以入栈中 右左
//因为中是先处理的
while (!stack.isEmpty()) {
TreeNode pop = stack.pop();
buildList.add(pop);
if (pop.right != null) {
stack.push(pop.right);
}
if (pop.left != null) {
stack.push(pop.left);
}
}
for (int i = 0; i < buildList.size()-1; i++) {
buildList.get(i).left=null;
buildList.get(i).right=buildList.get(i+1);
}
buildList.get(buildList.size()-1).left=null;
buildList.get(buildList.size()-1).right=null;
}
思路二:利用先序遍历的特性
上面那种方法需要额外空间,这种空间复杂度为O(1)
思路:将当前的左子树接到右边去,那么首先要找到的左子树、然后找到右子树的前驱节点,把右子树接到前驱,再把左子树整体移到右子树上。
听起来有点绕,来个例子,cur表示当前处理的节点,right_pre表示cur右子树的前驱
以实例中的图为例,从根节点开始
cur = 1
找到cur.left的最右节点right_pre,也就是4,然后把cur.right 接到right_pre后面。再把cur.left接到cur的右边
处理完了之后:
然后cur = cur.right,为什么能放心大胆地这么做,因为cur左边的都被移到右边了,并且是按照先序遍历移动的,所以直接找右边就可以。cur=2
将4 接到 3 后面,3 再接到2后面,就能得到
但是还是要继续去右边找,看有没有未处理的左子。
代码:
public void flatten(TreeNode root) {
TreeNode cur = root;
while ( cur!=null ){
//先序表里,找到当前节点的下一个节点
TreeNode right_pre = cur.left;
//找到cur.right的前一个,也就是左子树的最右节点
while (right_pre!=null && right_pre.right != null ){
right_pre = right_pre.right;
}
//拼接操作
if(right_pre!=null){
right_pre.right=cur.right;
//再把左边整个接到右边
cur.right=cur.left;
cur.left=null;
}
//继续寻找下一个
cur = cur.right;
}
}
边栏推荐
- Super Learning Method
- Jenkins User Manual (1) - Software Installation
- LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之三
- 职责链模式(responsibilitychain)
- 少即是多:视觉SLAM的点稀疏化(IROS 2022)
- 【LeetCode】653. 两数之和 IV - 输入 BST
- Win11怎么重装显卡驱动程序?Win11显卡驱动怎么卸载重装?
- tp5+微信小程序 分片上传
- onlyoffice设置跟踪变化trackChanges默认为对自己启动
- 在 .NET MAUI 中如何更好地自定义控件
猜你喜欢
Graphical Hands-on Tutorial--ESP32 OTA Over-the-Air Upgrade (VSCODE+IDF)
【虹科案例】基于3D相机组装家具
[Hongke case] Assembling furniture based on 3D camera
图文手把手教程--ESP32 OTA空中升级(VSCODE+IDF)
123
JUC (1) threads and processes, concurrency and parallelism, thread state, locks, producers and consumers
语音社交app源码——具备哪些开发优势?
图文手把手教程--ESP32 一键配网(Smartconfig、Airkiss)
OD-Model【5】:YOLOv1
C语言*小白的探险历程
随机推荐
SkiaSharp 之 WPF 自绘 粒子花园(案例版)
临床研究方法学,到现场,到数据真实发生的地方 | 对话数智 x 张维拓
线程必备内容
【Idea系列】idea配置
MySQL不提供数组,只能做成表吗?
Jina 实例秀|基于神经搜索的网络安全威胁检测(一)
Google Earth Engine APP——实现ui.Select() 的设定和条件判断
bitset的基本用法
秒云成功入选《2022爱分析 · 银行数字化厂商全景报告》,智能运维能力获认可
datax oracle to oracle增量同步
音频编辑 合唱
Graphical Hands-on Tutorial--ESP32 One-Key Network Configuration (Smartconfig, Airkiss)
Meishe Q&A Room | Meiying VS Meishe Cloud Editing
什么是 DevOps?看这一篇就够了!
Win11 file types, how to change?Win11 modify the file suffix
STM32前言知识总结
Super Learning Method
Digital management insight into retail and e-commerce operations - retail password
Zikko上市同时搭载HDMI2.1和2.5GbE新款雷电4扩展坞
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题