二叉树前中后序遍历详解
一、二叉树的前序遍历
1. 递归写法
前序遍历的核心规则是'根节点 → 左子树 → 右子树'。递归实现最直观,直接按照定义编写即可。
核心思路 先访问当前节点的值,再递归处理左子树,最后递归处理右子树。当遇到空节点时停止。
代码实现
/**
* Definition for a binary tree node.
* public 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),主要消耗在递归栈和结果列表上。这种方式代码简洁,但需注意递归深度过大可能导致栈溢出。
2. 迭代写法
迭代法利用栈来模拟递归调用过程。关键在于入栈顺序:为了保证'左子树'先于'右子树'被访问,我们需要将右子树先入栈,左子树后入栈。
核心逻辑
- 初始化栈,将根节点压入。
- 循环弹出栈顶节点并访问。
- 先将右子节点入栈,再将左子节点入栈(后进先出,确保左先出)。
代码实现
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if (root == null) list;
Deque<TreeNode> stack = <>();
stack.push(root);
(!stack.isEmpty()) {
stack.pop();
(node == ) ;
list.add(node.val);
(node.right != ) stack.push(node.right);
(node.left != ) stack.push(node.left);
}
list;
}
}


