Leetcode 114. 二叉树展开为链表

【中等】力扣算法题解析LeetCode114:二叉树展开为链表 这篇文章介绍了将二叉树展开为单链表的原地算法(O(1)空间复杂度)。核心思想是通过修改指针,将左子树嫁接到右子树之前,保持先序遍历顺序。具体步骤包括遍历节点、处理左子树、移动指针等操作,最终实现无需额外空间的展开。文章还提供了Java代码实现和操作示意图,帮助理解算法过程。 阅读详情

题目

给定一个二叉树,原地将它展开为链表。
在这里插入图片描述

来自力扣:leetcode 114. 二叉树展开为链表

解答

解法一:前序遍历

从图中可以看出,链表是按照前序遍历的顺序转换的。

所以很容易想到前序遍历的方式。

但要注意一点:遍历结点的左子树过程中结点的右子树会发生改变,所以需要暂存右子树结点。

代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    
    TreeNode last = null;
    public void flatten(TreeNode root) {
        if(root == null) return;

        TreeNode oldLeft = root.left;
        TreeNode oldRight = root.right;
        if(last != null) {
            last.left = null;
            if(last.right != root) {
                root.right = last.right;
                last.right = root;    
            }
        }
        
        last = root;
        flatten(oldLeft);
        flatten(oldRight);
    }
}
更精简的写法
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    
    TreeNode pre = null;
    public void flatten(TreeNode root) {
        if (root == null) return;
        
        if (pre != null) {
            pre.left = null;
            pre.right = root;
        }
        
        pre = root;
        TreeNode copyRight = root.right;
        flatten(root.left);
        flatten(copyRight);
    }
}
结果

在这里插入图片描述

解法二:倒着的前序遍历

既然正序的前序遍历会改变右子树,从而必须要暂存右子树。

那么我们可以倒着来,先展开右子树,再展开左子树,最后让根节点与这两个子链表链接起来。

顺序如下:右子树展开 -> 左子树展开并与右子树链接 -> 当前节点与左子树链接。

代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    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;        
    }
}
结果

在这里插入图片描述

解法三:后序遍历

另一种去除原来必须暂存右子树缺陷的方法就是采用后序遍历了。

主要思路是:

  1. 将当前节点的右子树放到左子树最右节点的右边。
  2. 然后将当前结点的右指针指向左子树,并把左指针置为空(避免环)。
  3. 这样一轮下来,左子树链表段的头和尾就确定了。
  4. 之后就是递归将链表段中间的结点转换。
  5. 当前链表段转换完毕后就可以根据该链表段尾部的右指针找到未转换的右子树了。
  6. 之后对右子树循环上述过程,最终就会转换成一条链表了。
递归代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public void flatten(TreeNode root) {
        if(root == null) return;
        
        flatten(root.left);
        flatten(root.right);
        if(root.left != null) {
            TreeNode mostRight = root.left;
            while(mostRight.right != null) mostRight = mostRight.right;
            mostRight.right = root.right;
            root.right = root.left;
            root.left = null;
        }
    }
}
非递归代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public void flatten(TreeNode root) {
        if(root == null) return;
        while(root != null) {
            if(root.left != null) {
                TreeNode mostRight = root.left;
                while(mostRight.right != null) mostRight = mostRight.right;
                mostRight.right = root.right;
                root.right = root.left;
                root.left = null;
            }
            
            root = root.right;
        }
    }
}
结果

在这里插入图片描述

SQL Prompt 9.0插件突然无法使用解决办法(附防联网激活)多图+文字 可能由于Redgate公司最近抓盗版抓得严,导致激活后的SQL Prompt联网后突然无法使用,无论卸载重装都没办法继续使用,本人同时使用SQL Assistant和SQL Prompt,我喜欢SQL Assistant代码提示功能,而SQL Prompt我喜欢将查询结果复制后可以直接生产插入脚本,这是最爽的一件事,即便对表有多么熟悉,没有这些插件,几行语法都要敲大半天,目前本人已经离不开这两个插... 阅读详情

相关推荐

RAG优化知识库检索(4):混合检索技术

混合检索技术在RAG(检索增强生成)系统中的应用显著提升了检索效果。本文探讨了语义检索与关键词检索的优缺点,指出两者在语义理解和精确匹配方面的互补性。通过结合BM25与向量检索,混合检索系统能够更全面地捕捉文档的相关性。文章详细介绍了并行检索、级联检索、稀疏-密集混合表示等多种结合方式,并探讨了权重调整策略,如线性组合、动态权重调整和排序融合算法。此外,稀疏-密集混合检索架构的设计和实现方案也被深入分析,展示了如何通过结合不同检索方法的优势,提升RAG系统的检索质量和效率。

分享一些感兴趣的技术方面 2071

[Leetcode][第114题][JAVA][二叉树展开为链表][递归][迭代]

【问题描述】[中等] 【解答思路】 1. 前序遍历 将二叉树展开为单链表之后,单链表中的节点顺序即为二叉树的前序遍历访问各节点的顺序。因此,可以对二叉树进行前序遍历,获得各节点被访问到的顺序。 由于将二叉树展开为链表之后会破坏二叉树的结构,因此在前序遍历结束之后更新每个节点的左右子节点的信息,将二叉树展开为单链表。 时间复杂度:O(N) 空间复杂度:O(N) 递归(自上而下) class Solution { public void flatten(TreeNode root) {

dadongwudi的博客 317

中移物联ML307C模组OPENCPU开发环境搭建全攻略

本文详细介绍了中移物联ML307C模组OPENCPU开发环境搭建的全过程。从OPENCPU模式的核心优势解析,到SDK获取、Python与scons工具安装,再到解读SDK目录结构与实战编译命令,最后提供常见问题避坑指南,帮助开发者快速构建高效的物联网应用编译环境。

weixin_29168393的博客 741

Leetcode刷题java之114. 二叉树展开为链表

执行结果: 通过 显示详情 执行用时 :0 ms, 在所有 Java 提交中击败了100.00% 的用户 内存消耗 :35.8 MB, 在所有 Java 提交中击败了86.84%的用户 题目: 给定一个二叉树,原地将它展开为链表。 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ ...

逆水行舟,不进则退 772

clumsy一款模拟弱网的工具

利用封装 Winodws Filtering Platform 的WinDivert 库, clumsy 能实时的将系统接收和发出的网络数据包拦截下来,人工的造成延迟,掉包和篡改操作后再进行发送。无论你是要重现网络异常造成的程序错误,还是评估你的应用程序在不良网络状况下的表现,clumsy 都能让你在不需要额外添加代码的情况下,在系统层次帮你达到想要的效果。

klb5555的专栏 2551

wpa_supplicant EAPOL状态机分析

wpa_supplicant EAPOL状态机分析

加油鸭 1476

力扣114. 二叉树展开为链表(java,用树模拟链表)

力扣114. 二叉树展开为链表(java,用树模拟链表)

LNsupermali的博客 1345

RK3576 PCIE接口调试:基于RTL8111HS的网卡驱动移植

检查项方法电源电压复位时序检查设备树 reset-gpios链路速率设备识别lspci -vvv驱动加载。

小灰灰的博客 731

LeetCode114.二叉树展开为链表------java语言

题目要求: 将二叉树转化为只有右子树的二叉树 思路: (1)若二叉树左右子树均为空,则就根节点一个节点; (2)若右子树不为空,则新组成的二叉树的右子树的最后一个节点则为左子树的最后一层最右边的孩子,左子树为整棵树的右子树; (3)若左子树不为空,就寻找左子树是否有右孩子,如果有,则继续选择,直至找到左子树的最后一个右孩子,该节点的左子树置空,右子树指向当前树的右子树。 (4)最后,根节点指向根...

weixin_44438340的博客 462

MIPI D-PHY TX 一致性测试实例解析 Part 01

汽车电子领域,尤其是ADAS,伴随着摄像头的大规模布局,MIPI信号的使用日益频繁,关于它的验证与分析工作也变得日益关键

一只豌豆象的博客 1万+

PPF函数可视化生产可能性边界线(R语言)

假设产品A的生产函数为A = 2 * R1 + R2,产品B的生产函数为B = R1 + 2 * R2,其中A和B分别表示产品A和产品B的产量,R1和R2表示资源1和资源2的分配数量。首先,让我们定义两种产品:产品A和产品B,它们的生产分别需要不同的资源和技术。现在我们已经计算了每种分配比例下的产品A和产品B的产量,接下来我们可以绘制生产可能性边界线。运行完整的代码后,我们将得到一个图形,显示了生产可能性边界线,该线代表经济体在给定资源和技术条件下所能生产的所有产品组合。

2301_79326559的博客 874

[LeetCode]114. 二叉树展开为链表(java实现)模拟题,修改指针

[LeetCode]114. (java实现)1. 题目2. 读题(需要重点注意的东西)3. 解法4. 可能有帮助的前置习题5. 所用到的数据结构与算法思想6. 总结 1. 题目 2. 读题(需要重点注意的东西) 思路(): 3. 解法 ---------------------------------------------------解法---------------------------------------------------: 可能存在的问题: 4. 可能有帮助的前置习题 5. 所用

cloud的博客 428

RT-DETR改进策略【卷积层】| CVPR-2020 Strip Pooling 空间池化模块 处理不规则形状的对象 含二次创新

一、本文介绍 本文记录的是利用Strip Pooling模块优化RT-DETR的目标检测网络模型。Strip Pooling结合了长而窄的卷积核形状在一个空间维度上的长程关系捕捉能力和在另一个空间维度上的局部细节捕捉能力,有效地处理复杂的场景信息。这一机制通过采用1×N1×N1×N或N×1N×1N×1的池化核形状来适应不同的图像特征,提高模型对目标形状和分布的适应性。在场景解析网络中,Strip Pooling可以被用于提升对具有长程带状结构或离散分布目标的解析能力,特别是在复杂场景或不同对象布局条件下效果

Limiiiing的博客 579

114. 二叉树展开为链表【 力扣(LeetCode) 】

【 弹出一个元素,最多压入两个元素,而这样的情况只会发生在添加子树时,一但不添加子树,就只会弹出,所以最坏情况就是2倍的树高;如果树退化为线性,则。进阶:你可以使用原地算法(O(1) 额外空间)展开这棵树吗?

yyh520025的博客 974

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LeetCode 力扣 114. 二叉树展开为链表

题目描述(中等难度) 把一个二叉树展开成一个链表,展开顺序如图所示。 解法一 可以发现展开的顺序其实就是二叉树的先序遍历。算法和 94 题 中序遍历的 Morris 算法有些神似,我们需要两步完成这道题。 将左子树插入到右子树的地方 将原来的右子树接到左子树的最右边节点 考虑新的右子树的根节点,一直重复上边的过程,直到新的右子树为 null 可以看图理解下这个过程。 1 / \...

wind_liang的博客 650

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

力扣第114题:二叉树展开为链表

给定一个二叉树,原地将其展开为一个单链表。

weixin_48941116的博客 1001

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【LeetCode】114. 二叉树展开为链表

本文介绍了将二叉树展开为链表的算法。题目要求展开后的链表顺序与二叉树先序遍历结果相同,且要求使用原地算法(O(1)额外空间)。主要方法包括:递归DFS+存储节点列表(O(n)空间)、递归DFS+原地修改(最优解)、迭代DFS+栈以及Morris遍历(真正的O(1)空间)。重点分析了后序遍历的原地修改技巧,即先处理子树再连接节点,通过找到左子树的最右节点来连接右子树。最优解法时间复杂度O(n),空间复杂度O(h)。文章还讨论了不同树结构的处理策略和边界条件,提供了清晰的算法流程图和复杂度分析。

qq_32019341的博客 1253

golang力扣leetcode 114.二叉树展开为链表

114.二叉树展开为链表114.二叉树展开为链表题解代码 114.二叉树展开为链表 114.二叉树展开为链表 题解 思路: 1.将原来的左子树放到右子树 2.将原来的右子树,放到原来的左子树的最右边 1 / \ 2 5 / \ \ 3 4 6 //将 1 的左子树插入到右子树的地方 1 \ 2 5 / \ \ 3 4 6 //将原来的右子树接到左子树的最

清风 975

LeetCode-114.二叉树展开为链表

来源:力扣(LeetCode)第114题 解题思路 根据题意,对每个节点作如下操作: ①.把其左儿子位置变成nullptr ②.其左儿子变换后放到右儿子的位置 ③.把右儿子变换后挂到左儿子变换后的末尾节点的右儿子位置 然后从根节点开始直接递归即可,基线条件是没有任何儿子节点直接返回自身 代码示例 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; ..

编程猿来如此 289

LeetCode力扣第114题:多种算法实现 将二叉树展开为链表

LeetCode力扣第114题:多种算法实现 将二叉树展开为链表

10年数据\经营分析经验,现任大厂数据分析负责人 719

力扣--114. 二叉树展开为链表

力扣--114. 二叉树展开为链表【题目描述】【示例】【解题过程】【思路】【代码】 这题用前序遍历的话,递归应该不难,但是官解给出了一个找父节点的方法,空间消耗是O(1),这里做个记录。 原题传送门 【题目描述】 【示例】 【解题过程】 代码是在官解上加了点自己的注释,思路也是自己根据代码分析的, 官解链接 【思路】 将原来的右子树与左子树的最右边节点连接 将左子树插入到右子树的地方 考虑新的右子树的根节点,一直重复直到新的右子树为 null 【代码】 /** * Definition for a

Catherinyy的博客 305

114. 二叉树展开为链表 - 力扣(LeetCode)

​ 这道题的思想是通过递归的方式,将二叉树的左子树和右子树分别展平,然后调整当前节点的左右子树,将左子树移到右子树的位置,并将原来的右子树接回。最终,整个二叉树被展平为一个只包含右子节点的单链表。

q1111111da的博客 466

leetcode-114-二叉树展开为链表-java

题目及测试 package pid114; /*114. 二叉树展开为链表 给定一个二叉树,原地将它展开为一个单链表。 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 */ public class main { public static void main

今天吃了吗的博客 374

LeetCode第114题:二叉树展开为链表

LeetCode第114题:二叉树展开为链表 问题描述 给定一个二叉树,原地将它展开为链表。 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 解题思路 二叉...

朕蹲厕唱忐忑的博客 261

LeetCode 114. 二叉树展开为链表

🌈🌈😄😄 欢迎来到茶色岛独家岛屿,本期将为大家揭晓LeetCode 114. 二叉树展开为链表,做好准备了么,那么开始吧。 🌲🌲🐴🐴

weixin_62275996的博客 627
上一篇: Leetcode 113. 路径总和 II
下一篇: Leetcode 116. 填充每个节点的下一个右侧节点指针
一纸浮萍
博客等级 码龄9年 11粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值