hot 100 第三十五题 35.二叉树的中序遍历

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

示例 1:

复制代码
输入:root = [1,null,2,3]
输出:[1,3,2]

示例 2:

复制代码
输入:root = []
输出:[]

示例 3:

复制代码
输入:root = [1]
输出:[1]

核心思路

二叉树遍历有三种方式:

  • 前序:根 → 左 → 右
  • 中序:左 → 根 → 右
  • 后序:左 → 右 →根

中序遍历的结果对于二叉搜索树 来说是升序序列

解法:递归(最简单)

复制代码
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        inorder(root, result);
        return result;
    }
    
    private void inorder(TreeNode node, List<Integer> result) {
        if (node == null) return;
        
        inorder(node.left, result);   // 左
        result.add(node.val);         // 根
        inorder(node.right, result);  // 右
    }
}
```

### 详细演示
```
二叉树:
    1
   / \
  2   3
 / \
4   5

递归调用栈:
inorder(1)
  ├─ inorder(2)
  │   ├─ inorder(4)
  │   │   ├─ inorder(null) 返回
  │   │   ├─ add(4) → [4]
  │   │   └─ inorder(null) 返回
  │   │
  │   ├─ add(2) → [4,2]
  │   │
  │   └─ inorder(5)
  │       ├─ inorder(null) 返回
  │       ├─ add(5) → [4,2,5]
  │       └─ inorder(null) 返回
  │
  ├─ add(1) → [4,2,5,1]
  │
  └─ inorder(3)
      ├─ inorder(null) 返回
      ├─ add(3) → [4,2,5,1,3]
      └─ inorder(null) 返回

结果: [4,2,5,1,3]
```

## 解法2:迭代(使用栈)

### 思路

用栈模拟递归的过程:
1. 一路向左,将所有左子节点入栈
2. 弹出栈顶,访问节点
3. 转向右子树,重复步骤1
```
核心:先找到最左边的节点,然后回溯

本质

中序遍历的核心:

  1. 递归思想 --- 左子树中序 + 根 + 右子树中序
  2. 模拟栈 --- 迭代用栈保存回溯路径
  3. Morris技巧 --- 利用空指针建立临时连接

应用场景

  • 二叉搜索树中序遍历得到升序序列
  • 验证二叉搜索树
  • 二叉搜索树中第K小元素
相关推荐
追随者永远是胜利者1 小时前
(LeetCode-Hot100)207. 课程表
java·算法·leetcode·go
仰泳的熊猫2 小时前
题目1535:蓝桥杯算法提高VIP-最小乘积(提高型)
数据结构·c++·算法·蓝桥杯
那起舞的日子2 小时前
动态规划-Dynamic Programing-DP
算法·动态规划
闻缺陷则喜何志丹3 小时前
【前后缀分解】P9255 [PA 2022] Podwyżki|普及+
数据结构·c++·算法·前后缀分解
每天吃饭的羊3 小时前
时间复杂度
数据结构·算法·排序算法
yzx9910133 小时前
Python数据结构入门指南:从基础到实践
开发语言·数据结构·python
ValhallaCoder4 小时前
hot100-堆
数据结构·python·算法·
小小小米粒4 小时前
函数式接口 + Lambda = 方法逻辑的 “插拔式解耦”
开发语言·python·算法
风吹乱了我的头发~5 小时前
Day31:2026年2月21日打卡
开发语言·c++·算法