题目描述
按中序(左根右)返回二叉树所有节点的值。
树 = 根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 报错)
- ❌ 把访问根放错位置 → ✅ 中序严格在左、右递归之间(位置决定了前/中/后序)
以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握。