新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/9/26 18:44:34来源:尧图网络
【二叉树-10】114.二叉树展开为链表
题目描述给你二叉树的根结点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]解题思路方法一递归后序遍历核心思路对于任意节点root递归展开左子树得到左子树链表递归展开右子树得到右子树链表拼接把左子树链表接到root-right把右子树链表接到左子树链表的末尾root-left nullptr具体过程示例1 / \ 2 5 / \ \ 3 4 6 第1步: 递归展开左子树(2) 2 \ 3 \ 4 第2步: 递归展开右子树(5) 5 \ 6 第3步: 拼接 1 \ 2 \ 3 \ 4 \ 5 \ 6 ✅代码实现写法1后序遍历推荐class Solution { public: void flatten(TreeNode* root) { if (root nullptr) return; // 先递归展开左右子树 flatten(root-left); flatten(root-right); // 保存右子树 TreeNode* right root-right; // 把左子树接到右边 root-right root-left; root-left nullptr; // 找到当前右子树的末尾接上原来的右子树 TreeNode* curr root; while (curr-right ! nullptr) { curr curr-right; } curr-right right; } };写法2前序遍历用栈class Solution { public: void flatten(TreeNode* root) { if (root nullptr) return; stackTreeNode* stk; stk.push(root); TreeNode* prev nullptr; while (!stk.empty()) { TreeNode* curr stk.top(); stk.pop(); if (prev ! nullptr) { prev-right curr; prev-left nullptr; } // 先压右再压左保证左先出栈 if (curr-right) stk.push(curr-right); if (curr-left) stk.push(curr-left); prev curr; } } };复杂度分析写法1后序递归维度复杂度说明时间复杂度O(n²)每次找右子树末尾需要 O(n)空间复杂度O(h)递归栈深度问题找右子树末尾的while循环导致 O(n²)。写法2前序栈维度复杂度说明时间复杂度O(n)每个节点入栈出栈各一次空间复杂度O(n)栈最多存储 n 个节点关键细节1. 为什么后序递归全局 prev能 O(n)遍历顺序右 → 左 → 根每次处理当前节点时prev已经指向了前序遍历中的下一个节点直接把root-right prev即可不需要找末尾2. 图解后序递归全局 prev1 / \ 2 5 / \ \ 3 4 6 遍历顺序: 6 → 5 → 4 → 3 → 2 → 1 处理6: prevnull, 6-rightnull, prev6 处理5: prev6, 5-right6, prev5 处理4: prev5, 4-right5, prev4 处理3: prev4, 3-right4, prev3 处理2: prev3, 2-right3, prev2 处理1: prev2, 1-right2, prev1 结果: 1 → 2 → 3 → 4 → 5 → 6 ✅3. 为什么前序栈要先压右再压左因为栈是后进先出先压右右在栈底再压左左在栈顶弹出时先弹出左符合前序顺序方法二找左子树的最右节点(原地算法)核心思路对于每个节点root如果root-left nullptr直接跳到root-right如果root-left ! nullptr找到左子树的最右节点前序前驱把root-right接到这个最右节点的右边把root-left移到root-rightroot-left nullptr继续处理新的root-right具体过程示例1 / \ 2 5 / \ \ 3 4 6 处理节点1: 左子树是2找左子树的最右节点 → 4 把 1-right (5) 接到 4-right 把 1-left (2) 移到 1-right 1-left nullptr 1 \ 2 / \ 3 4 \ 5 \ 6 处理节点2: 左子树是3找左子树的最右节点 → 3 把 2-right (4) 接到 3-right 把 2-left (3) 移到 2-right 2-left nullptr 1 \ 2 \ 3 \ 4 \ 5 \ 6 继续处理3、4、5、6最终得到: 1 → 2 → 3 → 4 → 5 → 6 ✅代码实现class Solution { public: void flatten(TreeNode* root) { TreeNode* curr root; while (curr ! nullptr) { if (curr-left ! nullptr) { // 找到左子树的最右节点前序前驱 TreeNode* prev curr-left; while (prev-right ! nullptr) { prev prev-right; } // 把当前节点的右子树接到前驱的右边 prev-right curr-right; // 把左子树移到右边 curr-right curr-left; curr-left nullptr; } // 继续处理下一个节点 curr curr-right; } } };复杂度分析维度复杂度说明时间复杂度O(n)每个节点最多被访问两次空间复杂度O(1)只用了几个指针为什么是 O(n)外层while遍历每个节点一次内层while找最右节点但每条边最多被走两次总操作次数 O(n)关键细节1. 为什么找左子树的最右节点因为前序遍历的顺序是根 → 左子树 → 右子树左子树的最后一个节点最右节点就是右子树的前驱把右子树接到它后面正好符合前序顺序2. 为什么curr curr-right不会死循环每次处理完当前节点后curr-right指向了左子树的根curr-left被置空所以curr curr-right会走到左子树的根继续处理最终会走到nullptr循环结束3. 为什么时间复杂度是 O(n) 而不是 O(n²)虽然内层while看起来可能很耗时但每条边最多被走两次一次找最右节点一次遍历总操作次数与节点数成正比所以是 O(n)三种方法对比方法时间复杂度空间复杂度是否原地推荐度后序递归全局 prevO(n)O(h)❌ 递归栈⭐⭐⭐⭐⭐前序栈O(n)O(n)❌ 栈⭐⭐⭐⭐原地算法O(n)O(1)✅原地⭐⭐⭐⭐⭐总结要点说明核心思想找左子树最右节点把右子树接过去关键操作prev-right curr-right; curr-right curr-left; curr-left nullptr时间复杂度O(n)空间复杂度O(1)
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

GPT-6爆猛料:OpenAI孤注一掷押注AGI,性能暴涨40%,多模态融合成终极形态!TaoToken统一Key配置实战 2026/9/26 19:39:57

GPT-6爆猛料:OpenAI孤注一掷押注AGI,性能暴涨40%,多模态融合成终极形态!TaoToken统一Key配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
闽乐电热口碑怎么样,市场评价如何 2026/9/26 19:39:51

闽乐电热口碑怎么样,市场评价如何

宁波市镇海区闽乐电器有限公司作为宁波镇海工业电热元件厂家,闽乐电热专注为工业设备、工业成套装备、新机配套、旧机改造和维修替换提供全品类工业电热元件综合服务,以工况匹配的定制化生产解决行业常见痛点,为客户提供可靠的工业电热配套方…

阅读更多 →
佛山AI算力服务器租赁报价评测:4家靠谱服务商实力对比 2026/9/26 19:39:45

佛山AI算力服务器租赁报价评测:4家靠谱服务商实力对比

深圳市鑫合辉科技有限公司是超微Supermicro官方认证授权代理商,专注于AI算力服务器相关的全链条服务布局,依托全球AI算力服务器头部原厂超微的全系列硬件产品体系,为各行业客户提供高灵活、高性价比、稳定供货的算力基础设施全周期解决方案&a…

阅读更多 →
treg CLI Agent工具链实战:OpenRouter与MCP协议集成指南 2026/9/26 19:39:45

treg CLI Agent工具链实战:OpenRouter与MCP协议集成指南

1. 从“treg”这个标题说起:一个被低估的CLI Agent工具链入口第一次看到“treg”这个词,很多人会以为是某个拼写错误,或者某个小众库的缩写。但如果你最近在折腾AI Agent、CLI工具链、MCP协议这些东西,大概率已经在某个技术群或者…

阅读更多 →
命令行智能体驱动视频自动化:Claude Code + ffmpeg + ElevenLabs + Remotion 全链路实践 2026/9/26 19:39:38

命令行智能体驱动视频自动化:Claude Code + ffmpeg + ElevenLabs + Remotion 全链路实践

1. 项目缘起:当视频处理遇上命令行智能体第一次看到video-use这个标题,我脑子里蹦出来的不是某个具体工具,而是一类正在快速成型的开发范式:把视频处理这种传统上依赖 GUI 软件、手动拖拽时间线的重活,交给命令行智能体…

阅读更多 →
010 Editor十六进制编辑实战:游戏存档与ELF固件修改指南 2026/9/26 19:39:38

010 Editor十六进制编辑实战:游戏存档与ELF固件修改指南

1. 项目概述:为什么游戏存档修改绕不开十六进制编辑器这道门槛你有没有过这样的经历:通关一款单机游戏后,想把角色等级调到99级再打一遍Boss,却发现游戏自带的“调试模式”早就被开发者删干净了;或者在玩某款老式掌机模…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉