当前位置: 首页 > news >正文

JAVA练习314- 二叉树展开为链表

题目概览

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

  • 展开后的单链表应该同样使用TreeNode,其中right子指针指向链表中下一个结点,而左子指针始终为null
  • 展开后的单链表应该与二叉树 先序遍历 顺序相同。

示例 1:

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

示例 2:

输入:root = []输出:[]

示例 3:

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

提示:

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

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

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

解题分析

方法一:先序遍历

使用栈来存储根节点,出栈时记录该节点,然后将该节点的右节点、左节点入栈,这样保证出栈的顺序永远是 根-左-右,每次出栈移动指针即可。

时间复杂度:O(n)
空间复杂度:O(n)

/** * 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; * } * } */ class Solution { public void flatten(TreeNode root) { if (root == null) { return; } Deque<TreeNode> dq = new LinkedList<>(); dq.push(root); TreeNode temp = new TreeNode(); while(!dq.isEmpty()) { TreeNode node = dq.pop(); temp.right = node; temp.left = null; temp = node; if (node.right != null) { dq.push(node.right); } if (node.left != null) { dq.push(node.left); } } } }

方法二:移动前驱右节点

由于根节点右边的节点一定是大于左边所有节点的,因此我们可以直接从左节点开始遍历,记录一开始的右节点(这里称作前驱节点),如果左节点存在右节点,我们就将前驱节点拼在右节点最右边叶子节点后面,这样构成的树依然是递增的,然后将该右节点作为新的前驱节点,将左节点移动到右节点的位置,继续从左节点遍历重复刚才步骤。

时间复杂度:O(n)
空间复杂度:O(1)

/** * 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; * } * } */ class Solution { public void flatten(TreeNode root) { if (root == null) { return; } TreeNode temp = root; while(temp != null) { TreeNode left = temp.left; if (left != null) { TreeNode leftRight = left; while(leftRight.right != null) { leftRight = leftRight.right; } leftRight.right = temp.right; temp.right = left; temp.left = null; } temp = temp.right; } } }
http://www.jsqmd.com/news/1220477/

相关文章:

  • 如何安装与配置BlockLauncher:Android版Minecraft启动器的快速入门教程
  • Agent Function Calling 错误分类:网络超时权限与业务异常
  • Selene 源码解析:深入理解 Python 浏览器测试框架的设计原理
  • TMS320F2838x GPIO复用配置详解:从寄存器操作到多核控制
  • 本手、俗手、妙手:围棋术语中的哲学智慧
  • GEO源码部署主体爱搜索GEO:赋能企业构建AI搜索核心优势实战指南 - 品牌报告
  • SpringBoot 自动配置完整原理
  • 2026 年 7 月百达翡丽中国官方授权售后网点完整名录|官方搬迁、新店启用统一公示公告 - 百达翡丽中国服务中心
  • Priceline Design System 代码迁移指南:从旧版本升级到最新版本
  • 实测甄选|天津靠谱奢侈品包包回收机构推荐,正规高价更安心 - 讯息早知道
  • GimpPs终极指南:如何3步将GIMP界面秒变Photoshop专业风格
  • SQL 递归查询实战:CTE 递归处理树形组织架构和物料 BOM
  • ECS-Network-Racing-Sample:Unity ECS多人赛车游戏完整入门指南
  • Win11Debloat:让Windows 11回归简洁本质的完整解决方案
  • InAppBillingPlugin 调试与排错:解决常见支付问题的 15 个实用技巧
  • 2026年毕业论文修改工具深度横评:学范文等五大平台实战避坑指南
  • STM32软件模拟I2C驱动AT24C02实战指南
  • 2026国内玻璃水滑道与高空漂流专业服务商综合评测及合规选型指南 - 互联网科技品牌测评
  • Gist插件与GitHub无缝集成:企业版API URL自定义教程
  • 2026昆山奢侈品回收实地横评:从估价到打款,这3家最让人放心 - 生活测评君
  • 每日关注简报|7月19日:AI成本、WSUS与GitHub
  • Protocol Buffers(简称 Protobuf)是 Google 开发的一种**语言中立、平台中立、可扩展的结构化数据序列化格式*
  • 苏州易奢福包包回收|2026香奈儿金球回收价参考,全国连锁30年正规回收优选 - 肉松卷
  • 深度解析vscode-git-graph架构设计:可视化Git仓库管理的技术实现
  • TI C2000 Flash预取与缓存机制:破解CPU与Flash速度瓶颈的实战指南
  • Apple Silicon用户必读:在M系列芯片上高效运行humanizer-1B-OptiQ-4bit的完整指南
  • PyAhoCorasick深度剖析:从理论到实践的多模式字符串匹配革命
  • 2026唐山高价回收名表靠谱商家 素君奢品汇13111597382 高价回收可上门 - GrowUME
  • Agent 内对话质量评分:自动化机评与人工抽样校验
  • 【企业级电话归档刚需】:为什么93%的合规团队仍在用错误的AI语音转文字方案?