二叉树---二叉树的中序遍历

🔥个人主页: Milestone-里程碑

❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>>

<<Git>><<MySQL>>

🌟心向往之行必能至

一、题目回顾

二叉树中序遍历 :按照 左子树 → 根节点 → 右子树 的顺序访问节点。

要求:不用递归 ,用 栈 + 迭代 实现。


二、完整可运行代码

cpp

运行

复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        TreeNode* cur = root;  // 当前遍历节点
        vector<int> v;        // 存储结果
        stack<TreeNode*> st;  // 迭代必备栈

        // 循环条件:当前节点不为空 或 栈不为空
        while (cur || !st.empty())
        {
            // 1. 一路向左,把所有左节点入栈
            while (cur)
            {
                st.push(cur);
                cur = cur->left;
            }

            // 2. 走到最左,cur 为空,弹出栈顶(根节点)
            TreeNode* top = st.top();
            st.pop();

            // 3. 访问根节点(中序核心位置)
            v.push_back(top->val);

            // 4. 转向右子树
            cur = top->right;
        }
        return v;
    }
};

三、核心思路(超级好记)

中序遍历:左 → 根 → 右

迭代版的逻辑可以总结为 4 步:

  1. 一路向左走到底,把经过的节点全部压入栈
  2. 走到最左边(cur == nullptr)
  3. 弹出栈顶 = 根节点,加入结果
  4. 去遍历右子树

完美对应中序遍历规则!


四、逐行代码精讲

1. 变量定义

cpp

运行

复制代码
TreeNode* cur = root;   // 当前走到的节点
vector<int> v;          // 保存遍历结果
stack<TreeNode*> st;    // 用栈记录回溯路径

2. 外层循环

cpp

运行

复制代码
while (cur || !st.empty())
  • 只要当前节点不为空 或 栈里还有节点没处理,就继续循环

3. 内层循环:一路向左

cpp

运行

复制代码
while (cur) {
    st.push(cur);
    cur = cur->left;
}
  • 把所有左孩子依次入栈
  • 直到走到 nullptr(最左下角)

4. 弹出栈顶 → 访问根节点

cpp

运行

复制代码
TreeNode* top = st.top();
st.pop();
v.push_back(top->val);
  • 此时弹出的就是左子树遍历完的根节点
  • 这一行就是中序遍历的访问位置

5. 走向右子树

cpp

运行

复制代码
cur = top->right;
  • 根访问完,去遍历右子树

五、执行流程(秒懂)

举个最简单的树:

plaintext

复制代码
    1
     \
      2
     /
    3

遍历顺序:1 → 3 → 2

执行步骤:

  1. cur=1,入栈 → 左为空
  2. 弹出 1 → 加入结果
  3. cur=1 的右孩子 2
  4. cur=2,入栈 → 左走 3
  5. cur=3,入栈 → 左为空
  6. 弹出 3 → 加入结果
  7. cur=3 的右为空
  8. 弹出 2 → 加入结果
  9. 结束

最终结果:[1,3,2] ✅


六、为什么这是最优写法?

  • 时间复杂度 O (n):每个节点入栈出栈各一次
  • 空间复杂度 O (n):最坏情况(链状树)
  • 无递归栈溢出风险
  • 面试标准满分写法
  • 前序、后序都可以基于这个模板改

七、总结(背会这 4 句话)

  1. 一路向左,全部入栈
  2. 走到最左,弹出栈顶
  3. 访问节点(中序位置)
  4. 转向右子树
相关推荐
GIS数据转换器5 小时前
地下空间综合管廊运营管理平台
大数据·开发语言·人工智能·经验分享·perl
猿究院_夏燊9 小时前
Spring Bean 生命周期
java·后端·spring
Wang's Blog10 小时前
Java 项目实战: 交友项目:登录链路回顾与今日任务地图
java·开发语言·状态模式·交友
遇码10 小时前
流式调用中途断连别直接报错:瞬态故障识别、退避重试与中文根因诊断的搭建方法
大数据·人工智能·ai·rust·数据分析·大模型·agent
信誓旦旦的程序猿10 小时前
【Python量化实战宝典 #08】可转债与债券接口手册:转股价·溢价率·纯债价值(Python 可跑)
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
砚底藏山河10 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
今年下半年10 小时前
AI智能体项目实战记录(02):初始化 Python 项目
开发语言·人工智能·python·fastapi
Jlzn888811 小时前
华东电芯分选通道数怎么配才不堵线
java·人工智能·架构·自动化·制造
JXJD200411 小时前
224G PAM4 高速线束:阻抗匹配设计与损耗控制的核心逻辑
大数据·ai
Williamtym11 小时前
PickGo Lab实践:用浏览器、Python和MCP串起机器人搬运仿真
开发语言·python·机器人