二叉树遍历基础
二叉树是数据结构中的核心结构之一,其遍历方式决定了访问节点的顺序。常见的遍历包括前序(根左右)、中序(左根右)和后序(左右根)。本文将深入探讨这三种遍历的递归与迭代实现,重点分析代码逻辑与空间复杂度。
一、二叉树的前序遍历
1. 递归写法
前序遍历的核心规则是'根节点 → 左子树 → 右子树'。递归实现最为直观,利用系统调用栈自动维护状态。
核心思路
- 若当前节点为空,直接返回。
- 将当前节点值加入结果列表。
- 递归遍历左子树。
- 递归遍历右子树。
代码示例
/**
* Definition for a binary tree node.
*/
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
class Solution {
private List<Integer> list = new ArrayList<>();
public List<Integer> preorderTraversal(TreeNode root) {
find(root);
return list;
}
private void find(TreeNode node) {
if (node != null) {
list.add(node.val);
find(node.left);
find(node.right);
}
}
}
解析
这种写法简洁明了,时间复杂度为 O(n),每个节点访问一次。空间复杂度取决于递归深度,最坏情况为 O(n)。注意全局变量 list 在多次调用时需注意重置,实际工程中建议作为参数传递或局部初始化。
2. 迭代写法
迭代法借助显式栈来模拟递归过程,避免深层递归导致的栈溢出风险。
核心思路
- 使用栈存储待访问节点。
- 遵循'先右后左'入栈原则,确保弹出时'先左后右',符合前序遍历顺序。
步骤拆解





