HOT100之二叉树中序遍历
递归法当我们在函数中调用函数时外层函数就会被操作系统暂停然后将外层函数的状态压入系统函数调用栈中再去执行新的函数由于系统函数调用栈空间往往是很小的一旦深度达到了数万层函数调用栈就会被撑爆导致崩溃并且由于系统函数调用栈位于底层每一次涉及的操作都会影响一系列底层逻辑使得开销和运行速度大大增加树节点定义struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode() : val(0), left(nullptr), right(nullptr){} TreeNode(int val 0, TreeNode* left nullptr, TreeNode* right nullptr) : val(val), left(left), right(right) {} };中序遍历的遍历顺序是左节点中节点右节点对一颗最小二叉树而言整体思路一颗二叉树应该先一直迭代左节点直至最左边的叶子节点然后将每一个节点都当作基于该节点为根节点的一颗独立子树非常重要贯穿整个树来遍历于是将中序遍历一个最小二叉树的方法封装成一个函数来不断嵌套不断迭代中序遍历一颗最小二叉树函数不唯一我们开始思考该遍历函数的具体思路对于一个最小二叉树一共只有三个节点在我们只知道根节点的情况下要实现中序遍历最核心的代码只有3行(仅作思路示范)vectorint res{}; void inorder(TreeNode* root) { res.push_back(root-left-val); res.push_back(root-val); res.push_back(root-right-val); }那么如何将其运用在整颗二叉树呢最关键的一句话每一个节点都当作基于该节点为根节点的一颗独立子树所以我们需要在每一个访问左右子节点的步骤中加入迭代。注意有空树的可能所以要加上判断条件void inorder(TreeNode* root vectorint res) { if(root ! nullptr)// { //左节点 inorder(root-left, res); //中节点 res.push_back(root-val); //右节点 inorder(root-right, res); } return; } vectorint inorderTraversal(TreeNode* root) { vectorint result{}; inorder(root, result); return result; }迭代法由于迭代法与的递归法基本原理相似递归法使用的是隐式的函数调用栈由系统自己维护迭代法需要我们自己手动维护栈结构来实现我们这道题也可以自己维护栈来代替递归法由于栈结构由我们自己维护在堆上所以很难发生栈溢出同时省去系统维护带来的底层频繁创建销毁函数调用而带来的巨大开销根据中序遍历左-中-右我们从根节点出发应该先访问其左节点是否存在若不存在则就直接录入根节点值然后再访问右节点若存在注意每一个节点都当作基于该节点为根节点的一颗独立子树来处理所以我们要先不断向左迭代直至最左叶子节点同时要记录向左迭代时经过的每一个节点所以vectorint inorderTraversal(TreeNode* root) { vectorint res; stackTreeNode* st; TreeNode* curr root;//为了防止丢失整棵树的位置我们需要用另一个节点来共同指向根节点 ...什么条件下开始迭代处理呢当栈中还有节点没处理即整棵树还没遍历完当前节点不为空但是两者之间关系又该是如何呢无论是栈中还有节点没处理父节点没遍历还是当前节点不为空可能存在子节点只要二者满足其一就可以正常迭代while(curr ! nullptr || !st.empty()) { }现在不断向左子节点迭代并保存只要当前节点不为空都要向左寻找子节点while(curr ! nullptr || !st.empty()) { while(curr ! nullptr) { st.push(curr); curr curr-left; }//结束时curr nullptr * }此时curr为空意味着左侧已经无路可走我们必须利用栈顶元素上一个路过的父节点进行回溯这时候根据中序遍历由于左节点为空所以要录入中节点st.top()-val别忘了用完这个节点就st.pop()以及向右寻找是否存在节点while(curr ! nullptr || !st.empty()) { while(curr ! nullptr) { st.push(curr); curr curr-left; }//结束时curr nullptr * curr st.top(); st.pop(); res.push_back(curr-val); curr curr-right; }所以完整codevectorint inorderTraversal(TreeNode* root) { vectorint result; stackTreeNode* st; TreeNode* curr root; while(curr ! nullptr || !st.empty()) { while(curr ! nullptr) { st.push(curr); curr curr-left; } curr st.top(); st.pop(); result.push_back(curr-val); curr curr - right; } return result; }

相关新闻

AI正在告别“聊天”:2026年,人工智能终于开始“干活”了

AI正在告别“聊天”:2026年,人工智能终于开始“干活”了

过去两年,人们对AI的印象大多停留在“聊天”——打开对话框,输入问题,等待一段流畅的回答。但2026年,这个局面正在被彻底改写。AI正从“会思考”走向“能干活”在7月初举行的2026全球数字经济大会上,一个共识被反复强调…

2026/7/8 4:02:18 阅读更多 →
Tokio:Rust 异步编程的工业级基石

Tokio:Rust 异步编程的工业级基石

当你的服务需要同时处理上万个 TCP 长连接,而你只有一台 4 核 8G 的云服务器时,你会选什么?Tokio 是 Rust 生态中最主流的异步运行时,GitHub 上超过 2.8 万 Star。它基于 Rust 的 async/.await 语法,提供了一套完整的异…

2026/7/8 4:02:18 阅读更多 →
GEO系统实战:多引擎自适应算法源码解析

GEO系统实战:多引擎自适应算法源码解析

一、行业痛点深度剖析 在日常实践中,我们团队接触到许多面临官网流量持续走低的企业。表面上,这似乎只是内容更新不及时,但当我们深入分析数据结构时,发现一个更隐蔽且关键的共性难题:随着 AI 驱动的搜索引擎&#xf…

2026/7/8 3:58:17 阅读更多 →

最新新闻

2026环氧彩砂和水泥基填缝剂哪个好?长期使用效果对比

2026环氧彩砂和水泥基填缝剂哪个好?长期使用效果对比

## 一、问题的提出:填缝材料选择的两难瓷砖铺贴完成后,填缝是最后一道工序,也是最容易被忽视的环节。填缝材料的选择不仅影响美观,更关系到后期的清洁维护和使用寿命。市面上主流的填缝材料分为两大类:**水泥基填缝剂*…

2026/7/8 4:54:31 阅读更多 →
OpenClaw Event Bus 架构深度解析:为什么事件溯源是 AI Agent 时代的最佳协作范式?

OpenClaw Event Bus 架构深度解析:为什么事件溯源是 AI Agent 时代的最佳协作范式?

OpenClaw Event Bus 架构深度解析:为什么事件溯源是 AI Agent 时代的最佳协作范式?工程笔记:本文不是 API 教程,是一份"OpenClaw 为什么这么设计"的技术剖析。重点讲清"为什么不是直接用 Redis Pub/Sub / Kafka&qu…

2026/7/8 4:54:31 阅读更多 →
高盛推出“2026年最重要交易“:AI金融应用从“讲故事“进入“算回报“时代

高盛推出“2026年最重要交易“:AI金融应用从“讲故事“进入“算回报“时代

2026年7月2日,全球芯片股暴跌。但同一周,高盛发布了2026年最重磅的一份交易报告。这两件事背后,是同一股力量在重塑全球金融市场。一、一周内的两个信号 7月2日,韩国KOSPI指数单日重挫7.89%,盘中触发熔断。费城半导体指…

2026/7/8 4:52:30 阅读更多 →
微信 API 开发实战:基于 GeWe 构建自动化任务调度系统

微信 API 开发实战:基于 GeWe 构建自动化任务调度系统

在微信自动化开发过程中,很多业务都需要定时执行任务,例如:定时发送消息自动发布朋友圈定时客户跟进群消息提醒多账号统一运营如果依靠人工操作,不仅效率低,也容易出现遗漏。通过 GeWe API 开放平台,开发者…

2026/7/8 4:50:30 阅读更多 →
【回眸】Taste-Skill 新手入门

【回眸】Taste-Skill 新手入门

在开发复杂系统时,我们常常面临一个两难选择:是追求极致的运行效率,还是保持代码的灵活与可维护性?很多时候,为了优化某个环节的性能,我们不得不引入沉重的框架或复杂的配置,导致项目变得臃肿不…

2026/7/8 4:48:29 阅读更多 →
边缘计算工程师:做了四年边缘节点我发现AI要到设备上跑

边缘计算工程师:做了四年边缘节点我发现AI要到设备上跑

我站在机房门口,看着一排边缘节点机箱的指示灯整齐地闪着绿光。它们已经跑了三年, mostly 在跑CDN缓存、日志归集、Web加速。三年前,客户会为"离用户更近"买单;现在,他们问的是"能不能在这些盒子里跑AI…

2026/7/8 4:46:28 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻