二叉树前中后序遍历详解:递归与迭代实现
二叉树遍历是数据结构中的基础操作,掌握其递归与迭代写法对于理解栈机制和递归逻辑至关重要。本文将详细拆解前序、中序、后序三种遍历方式的核心思路与代码实现。
一、二叉树的前序遍历
前序遍历的规则是'根节点 → 左子树 → 右子树'。
1. 递归写法
递归是最直观的实现方式。核心在于访问当前节点后,立即递归处理左右子树。
实现逻辑:
- 若当前节点为空,直接返回。
- 将当前节点值加入结果列表。
- 递归调用左子树。
- 递归调用右子树。
这种方式代码简洁,但需注意递归深度过大可能导致栈溢出。
import java.util.ArrayList;
import java.util.List;
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);
}
}
}
2. 迭代写法
使用栈来模拟递归过程。关键在于入栈顺序:为了保证先访问左子树,需要先将右子树入栈,再将左子树入栈(栈是后进先出)。
实现逻辑:
- 初始化栈,将根节点入栈。
- 循环弹出栈顶节点并记录值。
- 优先将右子树入栈,再压入左子树。
这样弹出的顺序自然符合'根 - 左 - 右'的规律。
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
(root == ) 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;
}
}


