LeetCode - Hot 100 - 二叉树的中序遍历

5 阅读2分钟

📌 题目描述

给定一个二叉树的根节点 root,返回它的 中序 遍历。

示例 1:

输入:root = [1,null,2,3]
输出:[1,3,2]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

🧠 思路分析

二叉树的遍历有三种经典顺序:前序(根左右)、中序(左根右)、后序(左右根)。中序遍历的顺序是:先遍历左子树,再访问根节点,最后遍历右子树

对于二叉搜索树(BST),中序遍历的结果天然就是一个升序序列,这也是中序遍历最典型的应用场景。

实现方式非常直接——递归:

  1. 递归遍历左子树
  2. 将当前节点的值加入结果列表
  3. 递归遍历右子树

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。

复杂度分析

  • 时间复杂度O(n)O(n),每个节点恰好访问一次
  • 空间复杂度O(n)O(n),最坏情况下(链状树)递归调用栈深度为 nn,平均情况(平衡树)为 O(logn)O(\log n)

🔗 LeetCode 原题链接

LeetCode 94. 二叉树的中序遍历