面试知识库

二叉树遍历模板:前中后序、层序与递归迭代一套拿下#

二叉树题目的入口往往不是某个复杂算法,而是先把遍历写稳。只要遍历稳了,很多题其实就是“在遍历过程中做一点事”。

⚡ 速记版模板#

// 模板用途:标准递归遍历骨架,可替换“处理当前节点”位置得到前/中/后序
void dfs(TreeNode node) {
    if (node == null) { // 递归终止条件:空节点直接返回
        return;
    }
    dfs(node.left); // 先递归左子树
    处理当前节点; // 在中间位置处理当前节点(这是中序遍历位置)
    dfs(node.right); // 再递归右子树
}
java

🎯 什么时候先写遍历模板?#

几乎所有二叉树题都离不开遍历:

  • 中序遍历
  • 最大深度
  • 翻转二叉树
  • 对称二叉树
  • 层序遍历
  • 验证 BST
  • 最近公共祖先
  • 路径总和

Hot 100 里的典型题目:

💡 递归三要素#

写树的递归时,先想清楚三件事:

  1. 函数参数和返回值是什么
  2. 终止条件是什么
  3. 当前节点要做什么

🚀 模板一:前序遍历#

顺序:根 -> 左 -> 右

适合:

  • 复制树结构
  • 构造路径
  • 展开树

🚀 模板二:中序遍历#

顺序:左 -> 根 -> 右

适合:

  • BST 相关题目
  • 验证是否有序
  • 第 K 小元素

🚀 模板三:后序遍历#

顺序:左 -> 右 -> 根

class Solution {
    private int dfs(TreeNode node) {
        if (node == null) { // 空树高度为 0
            return 0;
        }

        int left = dfs(node.left); // 先求左子树高度
        int right = dfs(node.right); // 再求右子树高度

        return Math.max(left, right) + 1; // 当前节点高度 = 子树最大高度 + 1(后序汇总)
    }
}
java

适合:

  • 高度计算
  • 路径和
  • 子树信息汇总

很多“先算左右子树,再决定当前节点答案”的题,都偏向后序。

🚀 模板四:层序遍历#

适合:

  • 层序遍历
  • 右视图
  • 每层统计信息

🚀 模板五:迭代中序遍历#

🧠 常见题目怎么套?#

1. 最大深度#

  • 后序递归:左右子树高度取最大

2. 翻转二叉树#

  • 前序或后序都可以
  • 在递归过程中交换左右孩子

3. 验证二叉搜索树#

  • 中序遍历结果必须严格递增

4. 最近公共祖先#

  • 后序思路更自然
  • 左右子树返回结果后再判断当前节点

⚠️ 易错点#

  1. 把遍历顺序想错

    • 先想清楚题目需要“先处理当前节点”还是“先拿到子树结果”
  2. 递归返回值和全局变量混用混乱

    • 计数类、路径类题目尤其容易乱
  3. 层序遍历忘记按层处理

    • 要先记录 size
  4. BST 题目误以为任意遍历都行

    • BST 的天然顺序是中序

🎨 面试时怎么说#

你可以这样说:

我先判断这题更适合哪种遍历顺序。如果题目依赖左右子树结果,就优先后序;如果是 BST 的顺序性质,就优先中序;如果题目按层处理,就用 BFS 层序遍历。

📌 一句话总结#

二叉树题目先别急着想花活,先问自己:

  • 这题最自然的遍历顺序是什么?
  • 当前节点的答案是否依赖左右子树?

把这两件事想明白,大部分树题就开了。