当前位置: 首页 > news >正文

二叉树的中序遍历

这段代码实现了二叉树的中序遍历(In-order Traversal),采用的是**非递归(迭代)**的方法。

中序遍历的逻辑顺序是:左子树 -> 根节点 -> 右子树。在迭代实现中,我们利用**栈(Stack)**来模拟递归时的函数调用栈,帮助我们在访问完左子树后“回退”到父节点。


1. 代码逐行注释

C++

class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int> res; // 存储遍历结果的数组 stack<TreeNode*> stk; // 辅助栈,用于暂存父节点,以便处理完左子树后能回来 // 循环条件:节点不为空(表示还有子树没钻到底)或者 栈不为空(表示还有父节点没处理) while (root != nullptr || !stk.empty()) { // --- 步骤 1: 一路向左狂奔 --- while (root != nullptr) { stk.push(root); // 将当前节点入栈(因为待会儿处理完左边还要回来找它) root = root->left; // 继续向左子节点移动 } // --- 步骤 2: 触底反弹,处理节点 --- root = stk.top(); // 从栈顶取出最近的一个“左尽头”节点 stk.pop(); // 弹出已取出的节点 res.push_back(root->val); // 【核心】访问当前节点(即中序遍历中的“根”) // --- 步骤 3: 转向右子树 --- // 既然当前节点和它的左子树都处理完了,接下来按顺序该看它的右子树了 root = root->right; } return res; // 返回最终的中序序列 } };

2. 核心思路分析

这个算法的核心在于**“先压后取”**:

  1. 左钻到底:中序遍历要求最先访问左下角的节点。通过while(root != nullptr),我们将沿途的所有节点都压入栈中。这些节点此时都在等待它们的左子树处理完毕。

  2. 栈的作用:栈在这里起到了“记事本”的作用。当我们走到最左边的叶子节点(nullptr)时,栈顶存储的就是该空节点的父节点。

  3. 转向右侧:一旦从栈中弹出一个节点并记录了它的值,说明该节点的左边已经全部搞定。根据左 -> 根 -> 右的规则,下一步必须移动到root->right。如果右孩子存在,它会重复“左钻到底”的过程;如果右孩子不存在,下一次循环会直接从栈中弹出更高层的父节点。


3. 运行示例

假设有一棵树如下:

1 \ 2 / 3
  1. 开始root指向 1。栈为空。

  2. 第一步:1 入栈,root移向 1 的左边(nullptr)。

  3. 第二步:栈不空,弹出 1,res = [1]root移向 1 的右边(节点 2)。

  4. 第三步:2 入栈,root移向 2 的左边(节点 3)。

  5. 第四步:3 入栈,root移向 3 的左边(nullptr)。

  6. 第五步:弹出 3,res = [1, 3]root移向 3 的右边(nullptr)。

  7. 第六步:弹出 2,res = [1, 3, 2]root移向 2 的右边(nullptr)。

  8. 结束:栈空且root为空,返回结果。

http://www.jsqmd.com/news/477282/

相关文章:

  • 什么是 Java 内存模型(JMM)?
  • OpenClaw 换机迁移指南
  • LLM几种主要的开源方式及优劣
  • EIG旗下MidOcean Energy将从JERA手中收购Gorgon LNG项目额外权益;双方探讨建立战略联盟
  • 2026 实测8款降AI率工具!知网/维普/Turnitin降AI率效果大比拼!
  • 执行引擎子系统
  • 软件测试进阶 | HTML常用标签详解:Web UI测试的“定位神器”
  • 用 AI 助手自动完成浏览器操作:OpenClaw 实战分享
  • Flutter 三方库 belatuk_combinator 鸿蒙适配指南 - 工业级组合数学运算与大规模排列枚举实战
  • 从园区到云核:传统网络与数据中心网络的分野与交汇
  • 第九章 微积分与数据分析:趋势预测和最优决策的工具
  • Linux入门第十二章,创建用户、用户组、主组附加组等相关知识详解
  • L2-004 这是二叉搜索树吗?
  • HarmonyOS APP<玩转React>开源教程六:数据模型设计与实现
  • 多模态AI实战:CLIP模型原理与代码深度剖析
  • 基于QWidget创建的自定义窗口在使用isVisible时造成程序崩溃
  • 2026海鲜泡沫箱采购攻略:精选厂家不容错过,国内头部泡沫箱企业排行榜单赋能企业生产效率提升与成本优化 - 品牌推荐师
  • 【最好最全面】openclaw安装方法【教程即时更新,永不过期】
  • CSDN Markdown 微笑与 section 符号
  • 打印机连接故障排除方案
  • SNMP(简单网络管理协议)
  • Python 中通过命令行向函数传参
  • 天津市优秀的GEO生成式AI引擎优化的公司有哪些
  • **WebTransport:下一代低延迟实时通信协议的实战解析与代码实现**
  • LSTM的工作原理
  • 2026年创业热潮来袭,专业创业指导定制公司能否成为TOP选择?
  • 闲置天猫超市卡别等过期!这样处理,安全又省心 - 可可收
  • 第三章 第一性原理:从零到一的完整思考方法论
  • 技术:双电脑共享鼠标、键盘解决方案 | USB对拷线、Synergy
  • 电赛信号题备赛日记(1)移植正点原子STM32H750 mini pro的TFTLCD屏幕