二叉树先、中、后序遍历的本质区别仅在于访问根节点的时机:先序为根→左→右,适用于复制树等;中序为左→根→右,BST中天然升序;后序为左→右→根,适用于计算树高等需子树结果的场景。

二叉树深度优先遍历的“先、中、后”序,本质区别只在访问根节点的时机,而非整体流程结构。三者都按“先左后右”的子树处理顺序推进,只是把“打印/处理当前节点”这一步,分别放在进入子树前、中间或最后。
先序遍历:根 → 左 → 右
适合需要优先获知层级结构的场景,比如复制树、序列化、构建表达式树。递归实现最直观:先操作当前节点,再递归左、右子树。
- 递归写法关键:print(root.val) 必须放在两个递归调用之前
- 迭代写法要点:用栈模拟,入栈顺序为“右→左”,保证左子树先被弹出处理
- 常见误点:把左右子树入栈顺序颠倒,导致输出变成“根→右→左”
中序遍历:左 → 根 → 右
对二分搜索树(BST)而言,中序遍历天然输出升序序列,这是它最核心的应用价值。递归实现中,“访问根”夹在左右递归之间。
- 递归写法关键:print(root.val) 必须放在左递归之后、右递归之前
- 迭代写法要点:持续向左走并压栈,直到空;弹出一个即访问,再转向其右子树
- 实用提示:判断一棵树是否为BST,可中序遍历并检查输出是否严格递增
后序遍历:左 → 右 → 根
适用于需子树结果才能处理父节点的场景,如计算树高、释放内存、求节点总数或叶节点数。递归时,“访问根”必须放在两个子树递归完成之后。
- 递归写法关键:print(root.val) 必须放在左右递归调用之后
- 迭代难点:不能简单复用先序模板;常用双栈法或标记法(记录某节点右子树是否已处理)
- 注意逻辑:只有当左右子树都遍历完,才真正“访问”当前节点









