登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
签到
每天签到奖励2-10圆
导读
排行榜
TG频道
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
VIP申请
VIP网盘
网盘
联系我们
发帖说明
每日签到
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
科技
›
【LeetCode 114】算法进阶:二叉树展开为链表 ...
【LeetCode 114】算法进阶:二叉树展开为链表
[ 复制链接 ]
辖瑁地
2025-8-15 16:54:30
给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。
进阶:你可以使用原地算法(O(1) 额外空间)展开这棵树吗?
需要在不使用额外存储空间的情况下,直接在原二叉树上进行操作。可以使用莫里斯遍历(Morris Traversal)的思想来实现。
莫里斯遍历的核心思想:
莫里斯遍历利用了二叉树的空闲指针(左子树为空时的左指针),将其指向右子树的前驱节点,从而实现中序遍历。我们也可以利用类似的思路来展开二叉树为单链表。
算法步骤:
1.找到左子树的最右节点:
从当前节点的左子树开始,一直向右走,直到找到最右节点。
这个最右节点是左子树的最后一个节点。
2.调整指针:
将最右节点的右指针指向当前节点的右子树。
将当前节点的左子树移到右子树的位置。
将当前节点的左指针置为 null。
3.移动到下一个节点:
每次处理完一个节点后,current 指针移动到当前节点的右子树。
时间复杂度:O(n),每个节点最多被访问两次。
空间复杂度:O(1),不使用额外的存储空间。
下面通过一个具体的例子来模拟原地算法(莫里斯遍历)的过程:
初始状态
1
/ \
2 5
/ \ \
3 4 6
复制代码
current 指向根节点 1
第一步:处理节点 1
检查左子树:节点 1 有左子树,左子树的根是 2。
找到左子树的最右节点:从 2 开始,向右走,找到最右节点 4。
调整指针:
将 4 的右指针指向 1 的右子树(即 5)。
将 1 的左子树移到右子树的位置。
将 1 的左指针置为 null。
调整后的状态:
1
\
2
/ \
3 4
\
5
\
6
复制代码
current 移动到 2
第二步:处理节点 2
检查左子树:节点 2 有左子树,左子树的根是 3。
找到左子树的最右节点:从 3 开始,向右走,没有右节点,最右节点是 3。
调整指针:
将 3 的右指针指向 2 的右子树(即 4)。
将 2 的左子树移到右子树的位置。
将 2 的左指针置为 null。
调整后的状态:
1
\
2
\
3
\
4
\
5
\
6
复制代码
current 移动到 3
第三步:处理节点 3
检查左子树:节点 3 没有左子树。
移动到右子树:current 移动到 3 的右子树,即 4。
第四步:处理节点 4
检查左子树:节点 4 没有左子树。
移动到右子树:current 移动到 4 的右子树,即 5。
第五步:处理节点 5
检查左子树:节点 5 没有左子树。
移动到右子树:current 移动到 5 的右子树,即 6。
第六步:处理节点 6
检查左子树:节点 6 没有左子树。
移动到右子树:current 移动到 6 的右子树,但 6 没有右子树,所以 current 变为 null,结束循环。
最终状态
1 -> 2 -> 3 -> 4 -> 5 -> 6
Java 代码实现:
class Solution {
public void flatten(TreeNode root) {
TreeNode current = root;
while (current != null) {
if (current.left != null) {
// 找到左子树的最右节点
TreeNode pre = current.left;
while (pre.right != null && pre.right != current) {
pre = pre.right;
}
if (pre.right == null) {
// 将当前节点的右子树接到左子树的最右节点
pre.right = current.right;
// 将左子树移到右子树的位置
current.right = current.left;
// 将左子树置为 null
current.left = null;
}
}
// 移动到下一个节点
current = current.right;
}
}
}
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
LeetCode
算法
进阶
二叉
展开
相关帖子
Blelloch并行扫描算法
Theta-star算法代码实现
超长语音合成、算法学习库、自托管软件导航,开发者速收
TListView进阶使用(3),创建自定义的列表项打造天气预报程序
快速幂算法的基础和扩展
欧几里得算法与扩展欧几里得算法详解
secp256k1算法详解四(关键点补充说明)
深度学习优化器算法巧思速览
SpringBoot进阶教程(八十七)数据压缩
国庆做题记录(基础算法)
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
Blelloch并行扫描算法
0
96
荡俊屯
2025-10-01
安全
Theta-star算法代码实现
0
980
赵淳美
2025-10-01
业界
超长语音合成、算法学习库、自托管软件导航,开发者速收
0
275
余思洁
2025-10-02
业界
TListView进阶使用(3),创建自定义的列表项打造天气预报程序
0
289
蝌棚煌
2025-10-03
业界
快速幂算法的基础和扩展
0
798
忙贬
2025-10-03
安全
欧几里得算法与扩展欧几里得算法详解
0
133
赶塑坠
2025-10-03
业界
secp256k1算法详解四(关键点补充说明)
0
498
红弘丽
2025-10-06
业界
深度学习优化器算法巧思速览
0
994
聊账
2025-10-08
业界
SpringBoot进阶教程(八十七)数据压缩
0
397
坏级尹
2025-10-08
业界
国庆做题记录(基础算法)
0
769
椎蕊
2025-10-09
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
辖瑁地
2025-8-15 16:54:30
关注
0
粉丝关注
19
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
anyue1937
9994888
dage888
999994
3934307807
993690
4
富账慕
10007
5
柴古香
9992
6
匝抽
9986
7
筒濂
9983
8
孙淼淼
9992
9
凌彦慧
9985
10
崔瑜然
9984
查看更多