学完递归,学二叉树的迭代遍历
什么是递归什么是迭代刚刚学的层层嵌套就是递归我感觉更直观些forwhile循环就是迭代。数学代码对比绝对简单我们算一个超级简单的数学题求 1 2 3 ... n 的和。写法一迭代循环自己控制进度int sum_iterative(int n) { int result 0; for (int i 1; i n; i) { // 我用 i 手动控制当前走到哪了 result result i; } return result; }计算机在干嘛它只负责重复执行大括号里的代码。没有任何“暂停”和“回头”一路加到 n 结束。写法二递归函数调自己系统帮你暂停int sum_recursive(int n) { if (n 1) return 1; // 停止条件 return n sum_recursive(n - 1); // 在这里暂停 }计算机在干嘛假设你调用sum_recursive(5)计算机看到5 sum_recursive(4)它必须先去算sum_recursive(4)。于是它暂停当前的计算在内存里记下“这里有个 5 等着加”去算sum_recursive(4)。算sum_recursive(4)时看到4 sum_recursive(3)又暂停去算sum_recursive(3)……直到算到sum_recursive(1) 1开始逐层回头123336641010515。前序遍历核心规则死记这一句前序遍历顺序是中 - 左 - 右先处理根再处理左最后处理右在迭代法中为了实现“先左后右”入栈时必须反着来先压入右孩子再压入左孩子。因为栈Stack是后进先出LIFO——后放进去的先拿出来。为了让左孩子先被拿出来处理就必须让左孩子最后放进去。放根 ➡️ 取根记录 ➡️ 放右 ➡️ 放左class Solution { public: vectorint preorderTraversal(TreeNode* root) { stackTreeNode* st; vectorint result; if (root NULL) return result; st.push(root); while (!st.empty()) { TreeNode* node st.top(); // 中 st.pop(); result.push_back(node-val); if (node-right) st.push(node-right); // 右空节点不入栈 if (node-left) st.push(node-left); // 左空节点不入栈 } return result; } };接下来再用迭代法写中序遍历的时候会发现套路又不一样了目前的前序遍历的逻辑无法直接应用到中序遍历上。中序遍历迭代法中序是一路向左入栈存无路可走出栈记转向右边再来一次。class Solution { public: vectorint inorderTraversal(TreeNode* root) { vectorint result; stackTreeNode* st; TreeNode* cur root; while (cur ! NULL || !st.empty()) { if (cur ! NULL) { // 指针来访问节点访问到最底层 st.push(cur); // 将访问的节点放进栈 cur cur-left; // 左 } else { cur st.top(); // 从栈里弹出的数据就是要处理的数据放进result数组里的数据 st.pop(); result.push_back(cur-val); // 中 cur cur-right; // 右 } } return result; } };后序遍历把前序左右翻一下就是中右左反着输出就是左右中。class Solution { public: vectorint postorderTraversal(TreeNode* root) { stackTreeNode* st; vectorint result; if (root NULL) return result; st.push(root); while (!st.empty()) { TreeNode* node st.top(); st.pop(); result.push_back(node-val); if (node-left) st.push(node-left); // 相对于前序遍历这更改一下入栈顺序 空节点不入栈 if (node-right) st.push(node-right); // 空节点不入栈 } reverse(result.begin(), result.end()); // 将结果反转之后就是左右中的顺序了 return result; } };

相关新闻

告别数据线束缚:3个场景解锁scrcpy安卓投屏的无限可能

告别数据线束缚:3个场景解锁scrcpy安卓投屏的无限可能

告别数据线束缚:3个场景解锁scrcpy安卓投屏的无限可能 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 你是否曾经想过,在电脑大屏幕上流畅操作手机应用,…

2026/7/19 13:26:33阅读更多 →
Copilot图表制作失效预警:当AI拒绝生成折线图时,你已踩中4个合规性/结构化/语义化雷区

Copilot图表制作失效预警:当AI拒绝生成折线图时,你已踩中4个合规性/结构化/语义化雷区

更多请点击: https://kaifayun.com 第一章:Copilot图表制作失效预警:当AI拒绝生成折线图时,你已踩中4个合规性/结构化/语义化雷区 为何Copilot突然“失语”?不是模型故障,而是输入越界 Copilot在图表生成…

2026/7/19 13:26:33阅读更多 →
深入学 LangChain 官方文档(二):Model 模型首讲

深入学 LangChain 官方文档(二):Model 模型首讲

深入学 LangChain 官方文档(二):Model 模型首讲 本篇对应的官方文档 LangChain Models:支撑统一模型接口、初始化参数,以及 invoke、stream、batch 三种调用合同。ChatOpenAI integration:支撑模型实例化、…

2026/7/19 13:24:33阅读更多 →
Godot引擎内存管理与资源泄漏检测实战指南

Godot引擎内存管理与资源泄漏检测实战指南

1. 项目概述:为什么Godot开发者必须关注内存如果你用Godot做过稍微复杂点的项目,比如一个包含多个场景、大量粒子效果和音频的2D平台游戏,或者一个3D的开放世界探索demo,大概率遇到过这种情况:游戏运行一段时间后&…

2026/7/19 20:44:25阅读更多 →
Flutter Android编译问题解析与优化方案

Flutter Android编译问题解析与优化方案

1. Flutter 编译 Android 程序的核心痛点解析 Flutter 作为跨平台开发框架,在 Android 平台的编译过程中存在几个典型痛点。首先,Flutter 的编译流程涉及 Dart 代码转 ARM 指令、Gradle 构建系统集成、原生平台适配等多个环节,这种多层级的架…

2026/7/19 20:44:25阅读更多 →
数据科学七道题:探测建模能力断层的实战压力测试

数据科学七道题:探测建模能力断层的实战压力测试

1. 这不是一场考试,而是一次照镜子的机会 你有没有过这种感觉:简历上写着“精通机器学习”,面试时被问到“线性回归的残差必须满足什么分布?为什么?”——你脱口而出“正态分布”,但下一秒被追问“如果残差…

2026/7/19 20:44:25阅读更多 →
Android开发环境搭建与配置全指南

Android开发环境搭建与配置全指南

1. Android系统编程入门:环境搭建全攻略 第一次接触Android系统编程时,最让人头疼的就是环境配置。记得2013年我刚入门时,花了两天时间才把开发环境跑起来,期间踩过的坑不计其数。现在回头看,其实只要掌握正确的方法&a…

2026/7/19 20:44:25阅读更多 →
Spring AI+RAG构建航空智能客服:从原理到企业级实践

Spring AI+RAG构建航空智能客服:从原理到企业级实践

如果你正在为航空客服系统的高并发咨询、复杂业务规则和24小时服务需求而头疼,那么Spring AI RAG的技术组合可能正是你需要的解决方案。传统客服系统面临的最大瓶颈不是回答不了问题,而是无法快速从海量航空手册、票价规则和航班信息中精准定位答案。本…

2026/7/19 20:44:25阅读更多 →
AM62L CPSW与USB外设寄存器深度解析:从线程映射到时间戳生成

AM62L CPSW与USB外设寄存器深度解析:从线程映射到时间戳生成

1. 项目概述 在嵌入式系统开发,尤其是涉及工业通信、汽车电子或网络设备的项目中,对处理器外设寄存器的深入理解是工程师从“能用”到“精通”的关键一步。最近在调试基于TI AM62L Sitara处理器的工业网关项目时,我花了大量时间研究其CPSW&am…

2026/7/19 20:42:25阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/18 22:49:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/19 14:50:26阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/19 18:50:36阅读更多 →