从零开始写算法——二叉树篇6:二叉树的右视图 + 二叉树展开为链表

二叉树的问题往往千变万化,但归根结底是对遍历顺序指针操作的掌控。

今天我们要探讨两道非常有代表性的题目:

  1. 二叉树的右视图:如何通过巧妙的 DFS 遍历顺序,捕捉特定视角的节点?

  2. 二叉树展开为链表:如何在不使用额外空间的情况下,对树的结构进行“大手术”?

本文将基于 C++ 代码,深度解析这两类问题的解题模版与核心思维。


一、 视角的艺术:二叉树的右视图

1. 题目与思路解析

题目要求我们返回从二叉树右侧能看到的节点值。直观上,这似乎需要层序遍历(BFS)取每一层的最后一个元素。但其实,利用DFS(深度优先搜索)可以写出更简洁的代码。

核心策略:

  • 反向中序遍历:传统的先序遍历是“中 -> 左 -> 右”,如果我们改为“中 -> 右 -> 左”,那么对于每一层来说,我们最先访问到的一定是这一层最右边的节点。

  • 深度标记:利用 depth 变量记录当前深度。如果 ans 数组的大小等于当前深度,说明我们第一次到达这一层,也就是找到了这一层的最右节点。

2. 代码实现

C++代码实现:

class Solution { vector<int> ans; void dfs(TreeNode* root, int depth) { if (root == nullptr) return; // 核心逻辑:ans.size() == depth 说明这是第一次到达该深度 // 因为我们优先走了右边,所以这就是最右边的点 if (ans.size() == depth) { ans.push_back(root->val); } // 优先递归右子树 dfs(root->right, depth + 1); // 注意这里是值传递递归,不是引用&,所以是不需要恢复现场的 dfs(root->left, depth + 1); } public: vector<int> rightSideView(TreeNode* root) { // 思路: 其实就是看右边的树的高度能否覆盖掉左边的树,换句话说如果答案的长度等于树的高度也就是加入ans dfs(root, 0); return ans; } };

3. 深度分析:为什么不需要“恢复现场”?

代码中有一句非常有价值的注释:注意这里是值传递递归,不是&,所以是不需要恢复现场的

这是一个非常关键的知识点。

  • 不需要回溯:我们在调用dfs(root->right, depth + 1)时,depth + 1是作为一个临时值传给下一层的。当前层手中的 depth 变量并没有被改变。因此,当右子树遍历结束,去遍历左子树时,我们依然使用原始的 depth 加 1 传给左边。

  • 需要回溯的情况:如果你使用的是全局变量 currentDepth 或者引用传递int& depth,那么在从右子树出来、进入左子树之前,就必须手动depth--

4. 复杂度分析

  • 时间复杂度:O(N),每个节点访问一次。

  • 空间复杂度:O(H),递归栈深度,最坏情况 O(N)。


二、 结构的重组:二叉树展开为链表

1. 题目与思路解析

这道题要求将二叉树原地展开为一个单链表(利用 right 指针)。顺序符合前序遍历。

难点挑战:你能否使用 O(1) 的额外空间来实现?(即不使用递归栈或额外的数组)。

核心策略:寻找前驱节点(Morris 遍历思想)我们要把“左子树”塞到“右子树”的前面。

  1. 找到当前节点 cur 的左子树中最右边的那个节点(这是 cur 在中序遍历下的前驱,也是左子树中最晚被访问的节点)。

  2. 把 cur 原本的右子树,接到这个前驱节点的右边。

  3. 把整个左子树移到 cur 的右边。

  4. cur 向右移动,重复上述过程。

2. 代码实现

C++代码实现:

class Solution { public: void flatten(TreeNode* root) { // 思路: 要自顶向下处理才可以满足O(1)空间复杂度的要求 // 因此可以先把234看作一个整体连在15中间,然后继续处理左子树 TreeNode* cur = root; while (cur) { // 只有左边有东西才需要搬运 if(cur->left) { // 1. 找左子树的最右节点 (接盘侠) TreeNode* p = cur->left; while (p->right) p = p->right; // 2. 把当前节点的右子树,嫁接到左子树最右节点的后面 p->right = cur->right; // 3. 把左子树整体挪到右边 cur->right = cur->left; // 4. 左边置空,防止双重指向 cur->left = nullptr; } // 继续处理链表的下一个节点 cur = cur->right; } } };

3. 深度分析:指针的乾坤大挪移

这段代码最精彩的地方在于**“整体搬运”**。

我们看一个局部:

Plaintext:

1 / \ 2 5 / \ \ 3 4 6

当 cur 指向 1 时:

  1. 找到左子树的最右节点:4

  2. 把 1 的右子树(5-6)接到 4 的后面。

  3. 把 1 的左子树(2-3-4)挪到 1 的右边。

  4. 结构变更为:1 -> 2 -> 3 -> 4 -> 5 -> 6

这一过程不需要递归,仅通过修改指针就完成了树的“拉直”。

4. 复杂度分析

  • 时间复杂度:O(N)。虽然有嵌套循环,但每个节点只会被作为“前驱节点”寻找一次,整体是线性的。

  • 空间复杂度:O(1)。我们只用了 cur 和 p 两个指针,没有使用递归栈,完美符合进阶要求。


三、 总结

  • RightSideView教会我们:DFS 的顺序(先右后左)可以帮我们“抢占”每一层的特定位置,配合 depth 值传递,逻辑清晰且无需回溯。

  • Flatten教会我们:指针的重组可以将树降维成链表。利用前驱节点(Predecessor)的概念,我们可以实现 O(1) 空间的算法,这是对数据结构最底层的操控能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1166869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UI-TARS桌面版深度解析:智能GUI操作完整实战指南

UI-TARS桌面版深度解析&#xff1a;智能GUI操作完整实战指南 【免费下载链接】UI-TARS-desktop A GUI Agent application based on UI-TARS(Vision-Lanuage Model) that allows you to control your computer using natural language. 项目地址: https://gitcode.com/GitHub_…

PDF补丁丁完整指南:从新手到高手的PDF处理秘籍

PDF补丁丁完整指南&#xff1a;从新手到高手的PDF处理秘籍 【免费下载链接】PDFPatcher PDF补丁丁——PDF工具箱&#xff0c;可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档&#xff0c;探查文档结构&#xff0c;提取图片、转成图片等等 项目地址: https://gitcode.c…

DeepSeek-R1应用场景:金融风控中的逻辑推理

DeepSeek-R1应用场景&#xff1a;金融风控中的逻辑推理 1. 引言 在金融风控领域&#xff0c;决策过程往往依赖于复杂的规则判断、异常模式识别以及多条件的逻辑推演。传统的规则引擎虽然可解释性强&#xff0c;但在面对模糊边界、非线性关联和动态变化的风险场景时显得僵化&a…

LogicAnalyzer实战指南:从信号捕获到协议分析的完整解决方案

LogicAnalyzer实战指南&#xff1a;从信号捕获到协议分析的完整解决方案 【免费下载链接】logicanalyzer logicanalyzer - 一个多功能逻辑分析器软件&#xff0c;支持多平台&#xff0c;允许用户捕获和分析数字信号。 项目地址: https://gitcode.com/GitHub_Trending/lo/logi…

.NET框架下的Office插件开发实战指南

.NET框架下的Office插件开发实战指南 【免费下载链接】NetOffice &#x1f30c; Create add-ins and automation code for Microsoft Office applications. 项目地址: https://gitcode.com/gh_mirrors/ne/NetOffice 引言&#xff1a;解决传统Office开发的痛点 在企业级…

AI出海企业必看:Hunyuan-MT1.5-1.8B多语言翻译落地指南

AI出海企业必看&#xff1a;Hunyuan-MT1.5-1.8B多语言翻译落地指南 1. 引言 随着全球化进程的加速&#xff0c;AI出海企业在拓展国际市场时面临日益增长的多语言沟通需求。高质量、低延迟、可本地化部署的翻译模型成为支撑跨境业务的核心基础设施之一。在此背景下&#xff0c…

小白必看!MinerU让文档解析变得如此简单

小白必看&#xff01;MinerU让文档解析变得如此简单 1. 引言&#xff1a;为什么需要智能文档理解&#xff1f; 在日常工作中&#xff0c;我们经常需要处理大量的PDF文件、扫描件或截图形式的文档&#xff0c;例如学术论文、财务报表、项目方案等。传统的OCR工具虽然能够识别文…

SillyTavern终极指南:解锁AI聊天新维度的深度实战手册

SillyTavern终极指南&#xff1a;解锁AI聊天新维度的深度实战手册 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 你是否曾幻想过与AI角色在赛博朋克都市漫步&#xff0c;或是在樱花飘落的…

EyesGuard:智能视力守护者,为你的数字生活保驾护航

EyesGuard&#xff1a;智能视力守护者&#xff0c;为你的数字生活保驾护航 【免费下载链接】EyesGuard &#x1f440; Windows Application for protecting your eyes 项目地址: https://gitcode.com/gh_mirrors/ey/EyesGuard 在屏幕时间占据我们日常生活绝大部分的今天…

UI-TARS桌面版终极指南:让AI成为你的电脑管家

UI-TARS桌面版终极指南&#xff1a;让AI成为你的电脑管家 【免费下载链接】UI-TARS-desktop A GUI Agent application based on UI-TARS(Vision-Lanuage Model) that allows you to control your computer using natural language. 项目地址: https://gitcode.com/GitHub_Tre…

EnchantmentCracker实战指南:告别Minecraft随机附魔的终极方案

EnchantmentCracker实战指南&#xff1a;告别Minecraft随机附魔的终极方案 【免费下载链接】EnchantmentCracker Cracking the XP seed in Minecraft and choosing your enchantments 项目地址: https://gitcode.com/gh_mirrors/en/EnchantmentCracker 还在为Minecraft中…

STLink驱动下载失败解决:完整指南(硬件烧录篇)

STLink烧录失败&#xff1f;一文搞定驱动与硬件全链路排查&#xff08;实战派指南&#xff09; 你有没有经历过这样的时刻&#xff1a; 代码写完&#xff0c;编译通过&#xff0c;信心满满地插上STLink准备烧录——结果IDE弹出“ No ST-Link detected ”或“ Target not c…

从噪音到清晰语音|利用FRCRN语音降噪镜像实现高质量音频增强

从噪音到清晰语音&#xff5c;利用FRCRN语音降噪镜像实现高质量音频增强 1. 引言&#xff1a;语音降噪的现实挑战与技术演进 在真实场景中&#xff0c;语音信号常常受到环境噪声、设备干扰和混响等因素的影响&#xff0c;导致通话质量下降、语音识别准确率降低。尤其在远程会…

这些精彩案例告诉你:Qwen3-Embedding-0.6B到底能做什么

这些精彩案例告诉你&#xff1a;Qwen3-Embedding-0.6B到底能做什么 1. 引言&#xff1a;轻量级嵌入模型的崛起与应用前景 在信息爆炸的时代&#xff0c;如何从海量文本中高效提取语义、实现精准检索已成为自然语言处理&#xff08;NLP&#xff09;领域的核心挑战。传统的关键…

3分钟掌握res-downloader:零门槛使用的网络资源嗅探工具

3分钟掌握res-downloader&#xff1a;零门槛使用的网络资源嗅探工具 【免费下载链接】res-downloader 资源下载器、网络资源嗅探&#xff0c;支持微信视频号下载、网页抖音无水印下载、网页快手无水印视频下载、酷狗音乐下载等网络资源拦截下载! 项目地址: https://gitcode.c…

大麦自动抢票神器:告别抢票焦虑的终极指南

大麦自动抢票神器&#xff1a;告别抢票焦虑的终极指南 【免费下载链接】ticket-purchase 大麦自动抢票&#xff0c;支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为心仪演唱会门票秒空而烦恼&#xff1f;…

SillyTavern提示工程优化:三维度精准控制AI对话输出

SillyTavern提示工程优化&#xff1a;三维度精准控制AI对话输出 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 在人工智能对话系统开发中&#xff0c;提示工程的质量直接决定了AI输出的准…

ESP32接入OneNet:OTA远程升级项目应用

ESP32连接OneNet实现OTA远程升级&#xff1a;从原理到实战的完整指南你有没有遇到过这样的场景&#xff1f;一批部署在偏远山区的环境监测设备&#xff0c;突然发现固件中存在一个严重的内存泄漏问题。按传统方式&#xff0c;得派人带着笔记本、USB线和调试器&#xff0c;翻山越…

声纹技术入门第一步:选择合适的测试音频样本

声纹技术入门第一步&#xff1a;选择合适的测试音频样本 1. 引言&#xff1a;为什么音频样本选择至关重要 在声纹识别系统中&#xff0c;输入的语音质量直接决定了模型输出的准确性。CAM 作为一个基于深度学习的说话人验证工具&#xff0c;其核心能力是提取语音中的192维特征…

MatterGen材料生成AI平台:零基础快速部署全攻略

MatterGen材料生成AI平台&#xff1a;零基础快速部署全攻略 【免费下载链接】mattergen Official implementation of MatterGen -- a generative model for inorganic materials design across the periodic table that can be fine-tuned to steer the generation towards a w…