图解题库 / 二叉树 · 遍历

94. 二叉树的中序遍历

简单 含交互动画

学完这道你应该能: 说清它为什么用「遍历」,而不是死记步骤; 合上页面,自己默写出核心代码; 用 30 秒把思路讲清楚。

题目描述

中序(左根右)返回二叉树所有节点的值。

= 根4,左子树(2,1,3),右子树(6,5,7)
中序输出 = [1, 2, 3, 4, 5, 6, 7]

思路解析

中序的精髓:到任何节点,都先把左子树整个走完,再访问自己,最后走右子树。换成前序就是「根左右」、后序就是「左右根」——只是访问自己的时机不同。

一路向左到底 · 1:从根 4 出发,一直往左走:4→2→1,到最左的 1(它没有左孩子)。先访问它。

访问 1 → 回到 2:访问 1(结果加 1),它没有右孩子,返回到父节点 2,访问 2。

2 的右孩子 → 3:2 访问完,转向它的右孩子 3,访问 3。左子树 (1,2,3) 全部走完

回到根 · 访问 4:左子树彻底走完,现在访问根 4。接下来轮到右子树。

右子树最左 · 5:进入右子树 6,同样先一路向左到 5,访问 5。

访问 6 → 7:回到 6 访问,再转向它的右孩子 7。

完成 · 升序:全部访问完:[1,2,3,4,5,6,7],正好升序——这是 BST 中序遍历的招牌性质。

不想递归?用栈:一路把左节点压栈,到底后弹出访问、再转向其右子树。栈替你记住了"回头要访问谁"。

前序(根左右)、中序(左根右)、后序(左右根)是同一套递归骨架,只是把"访问自己"放在递归左、右之间的不同位置。

参考代码(Python)

Python
1def inorder(node, res):
2    if not node: return        # 空节点,回头
3    inorder(node.left, res)    # ① 左
4    res.append(node.val)       # ② 根
5    inorder(node.right, res)   # ③ 右
6res = []; inorder(root, res); return res

复杂度分析

  • 时间复杂度:O(n) —— 每个节点访问一次
  • 空间复杂度:O(h) —— 递归栈,h 是树高

套路模板

记住骨架:空则返回、递归左、递归右,把处理节点的代码放在三个位置之一,就是前/中/后序。几乎所有树的递归都从它长出来。

Python
1def dfs(node):
2    if not node: return       # 递归出口:空节点
3    # 前序: 在这里处理 node
4    dfs(node.left)
5    # 中序: 在这里处理 node
6    dfs(node.right)
7    # 后序: 在这里处理 node

易错点

  • 忘了空节点的递归出口 → ✅ if not node: return(没有出口会对 None 取 .left 报错)
  • 把访问根放错位置 → ✅ 中序严格在左、右递归之间(位置决定了前/中/后序)

以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握

下一题 →104. 二叉树的最大深度 ← 返回题库