📌 题目描述
给定一个二叉树的根节点 root,返回它的 中序 遍历。
示例 1:
输入:root = [1,null,2,3]
输出:[1,3,2]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
🧠 思路分析
二叉树的遍历有三种经典顺序:前序(根左右)、中序(左根右)、后序(左右根)。中序遍历的顺序是:先遍历左子树,再访问根节点,最后遍历右子树。
对于二叉搜索树(BST),中序遍历的结果天然就是一个升序序列,这也是中序遍历最典型的应用场景。
实现方式非常直接——递归:
- 递归遍历左子树
- 将当前节点的值加入结果列表
- 递归遍历右子树
以 root = [1,null,2,3] 走一遍:
1
\
2
/
3
dfs(1):
dfs(1.left) → dfs(null) → 直接返回
res.add(1) → res = [1]
dfs(1.right) → dfs(2):
dfs(2.left) → dfs(3):
dfs(3.left) → dfs(null) → 直接返回
res.add(3) → res = [1, 3]
dfs(3.right) → dfs(null) → 直接返回
res.add(2) → res = [1, 3, 2]
dfs(2.right) → dfs(null) → 直接返回
最终: [1, 3, 2] ✓
🖼️ 图解与执行流程
[1]
\
[2]
/
[3]
中序遍历顺序:左 → 根 → 右
dfs(1)
├─ dfs(1.left = null) → 返回
├─ res.add(1) → [1]
└─ dfs(1.right = 2)
├─ dfs(2.left = 3)
│ ├─ dfs(3.left = null) → 返回
│ ├─ res.add(3) → [1, 3]
│ └─ dfs(3.right = null) → 返回
├─ res.add(2) → [1, 3, 2]
└─ dfs(2.right = null) → 返回
结果: [1, 3, 2] ✓
递归的调用栈天然记录了"回到哪里"——当左子树遍历完返回后,自然就执行到 res.add(root.val),然后继续遍历右子树。代码写起来非常简洁,三行递归就搞定了整个遍历过程。
💻 核心代码实现
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
// 中序遍历:左 → 根 → 右
List<Integer> res = new ArrayList<>();
dfs(root, res);
return res;
}
private void dfs(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
dfs(root.left, res); // 先遍历左子树
res.add(root.val); // 再访问根节点
dfs(root.right, res); // 最后遍历右子树
}
}
代码只有三行核心逻辑——左、根、右,顺序一换就能变成前序或后序遍历。dfs 方法把 res 作为参数传进去,避免了全局变量,写法也更清晰。递归终止条件就是 root == null,直接 return。
复杂度分析
- 时间复杂度:,每个节点恰好访问一次
- 空间复杂度:,最坏情况下(链状树)递归调用栈深度为 ,平均情况(平衡树)为