详解二叉树展开为链表:从递归到 O(1) 空间的极致优化

详解二叉树展开为链表:从递归到 O(1) 空间的极致优化

详解二叉树展开为链表:从递归到 O(1)O(1)O(1) 空间的极致优化

在二叉树的算法面试题中,“Flatten Binary Tree to Linked List” (将二叉树展开为链表) 是一道非常经典的题目(LeetCode 114)。它不仅考察我们对树遍历的理解,更考察我们在改变树结构时对指针的掌控能力。

本文将基于三种不同的思路——递归先序遍历迭代栈模拟以及空间复杂度 O(1)O(1)O(1) 的原地变换进行思考。

题目核心目标

给定一个二叉树的根节点 root,我们需要将其展开为一个单链表

  1. 展开后的链表顺序应与二叉树的先序遍历(根 →\rightarrow→ 左 →\rightarrow→ 右)顺序一致。
  2. 单链表使用 TreeNoderight 指针构建,所有节点的 left 指针必须设为 null
  3. 原地修改,不能创建新的节点。

方法一:递归先序遍历 (直观解法)

最符合直觉的方法是直接按照先序遍历的逻辑进行递归。但是,这道题的难点在于:我们在遍历的同时正在破坏原本的树结构

如果我们直接修改当前节点的 right 指针,原本的右子树就会丢失。为了解决这个问题,我们需要在修改指针前对右子节点进行备份

代码实现

classSolution{ // 全局指针,始终指向当前已处理链表的最后一个节点privateTreeNode prev =null;publicvoidflatten(TreeNode root){ if(root ==null)return;preorder(root);}privatevoidpreorder(TreeNode node){ if(node ==null)return;// 1. 链接操作:如果有前驱节点,将其右指针指向当前节点,左指针置空if(prev !=null){  prev.left =null; prev.right = node;}// 2. 指针推进:当前节点成为新的链表尾部 prev = node;// 3. 关键备份:暂存右子节点// 原因:下一步递归左子树时,prev (即当前 node) 的 right 指针会被修改指向左子节点// 若不备份,原右子树的引用将丢失TreeNode right

Read more

OpenClaw(龙虾)开源AI智能体科普解析:核心原理、功能特性与本地部署教程

OpenClaw(龙虾)开源AI智能体科普解析:核心原理、功能特性与本地部署教程

近期开源AI领域,OpenClaw(俗称“龙虾”)凭借其本地优先、可定制的特性,受到开发者社区的广泛关注,其项目保活程度与社区活跃度可通过GitHub数据直观体现:目前该项目已获得222k stars、1.2k watching、42.3k forks,各项数据均处于开源AI智能体领域前列,足以证明其社区认可度与持续更新能力。作为一款开源AI智能体工具,它在办公自动化、系统辅助等场景具有实用价值,适合开发者了解和落地实践。 OpenClaw是一款开源的个人AI助手编排平台,采用TypeScript开发,目前在GitHub上拥有较高的关注度,其核心价值在于将大模型的推理能力与本地系统操作相结合,打破了传统AI助手“仅能交互、无法执行”的局限。本文将从技术科普角度,围绕OpenClaw的核心定义、功能特性、技术细节及本地部署步骤展开,帮助开发者全面了解这款工具的原理与使用方法。 对于ZEEKLOG的开发者群体而言,了解OpenClaw的技术架构与应用场景,既能拓展AI智能体的认知边界,也能将其应用于日常开发、办公场景,提升工作效率。 本文将从「核心定义、功能特性、技术细节、本地部署」

By Ne0inhk
分布式版本控制系统Git的安装和使用

分布式版本控制系统Git的安装和使用

🌈个人主页: Hygge_Code🔥热门专栏:从0开始学习Java | Linux学习| 计算机网络💫个人格言: “既然选择了远方,便不顾风雨兼程” 文章目录 * 一、关于版本控制 * 1. 什么是“版本控制”? * 2. 版本控制系统(VCS)带来的好处🐦‍🔥 * 3. 版本控制系统分类 * 二、Git核心 * 1. 三大文件状态 * 2. 四步完成一次代码提交 * 三、Git实战:从环境配置到命令详解 * 1. 环境配置 * Git的安装操作 * 2. 本地操作命令 * 3. 远程操作命令 * 四、Git分支与标签 * 1. 分支:隔离开发 * 2. 标签:标记重要版本 * 五、版本库目录与编码规范 * 1. 版本库目录规范

By Ne0inhk
【记录】Copilot|Github Copilot重新学生认证通过方法(2025年7月,包括2FA和认证材料、Why are you not on campus)

【记录】Copilot|Github Copilot重新学生认证通过方法(2025年7月,包括2FA和认证材料、Why are you not on campus)

文章目录 * 前言 * 步骤 * 最重要的一步 前言 事实上,Github Copilot马上就要开源了,我原本的认证过期了。但是在我体验了众多的代码补全工具实在是太难用了之后,我觉得一天也等不了了,就去再一次认证了学生认证。 这次严格了很多,要求巨无敌多,这里写一下新认证要干的事情。 一口气认证了八次的含金量谁懂,把要踩的坑全踩完了。。 步骤 (如果你是第一次认证还要额外添加一下自己的学校邮箱,这里我就略过不提了) 在所有的步骤之前,最好确保你的本人就在学校或者在学校附近。当你出现了报错You appear not to be near any campus location for the school you have selected.时,会非常难通过。 而其他的报错可以按我下文这种方式通过。 (对于部分学校,比如华科大)双重认证Two-factor authentication要打开:跳转这个网站https://github.com/settings/security,然后点下一步开启认证,

By Ne0inhk

通过 GitHub 仓库下载微信 Mac & Windows 历史版本(Rodert 提供)

如何下载历史安装包 很多用户在使用微信电脑版时,可能会遇到 新版功能不适配、系统兼容问题,甚至只是单纯喜欢某个旧版界面。这时候,下载 微信历史版本 就成为一种需求。本文将详细介绍如何通过 GitHub 仓库(Rodert 提供)下载 微信 Mac 与 Windows 的旧版本,并解答常见问题。 为什么要下载微信旧版本? * 兼容性需求:某些新版可能与老系统(Windows7、老版本 macOS)不兼容。 * 功能保留:部分功能在新版被修改或取消,用户希望继续使用。 * 稳定性:新版出现 Bug 时,回退到稳定旧版可以作为应急方案。 * 轻量化:旧版本体积更小,适合低配置电脑。 微信 Mac 历史版本下载(Rodert 仓库) 如果你是 Mac 用户,可以通过 GitHub

By Ne0inhk