二叉树前中后序遍历详解:递归与迭代实现
二叉树的遍历是数据结构中的基础操作,掌握前序、中序和后序的递归与迭代写法,对于理解树形结构至关重要。本文将结合 Java 代码,深入剖析这三种遍历的核心逻辑及实现细节。
一、前序遍历 (Preorder)
前序遍历的顺序是:根节点 → 左子树 → 右子树。这是最直观的遍历方式。
1. 递归实现
递归写法最符合直觉。核心在于访问当前节点后,立即递归处理左右子树。
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); // 递归右
}
}
}
注意:这里使用了一个成员变量 list 来存储结果。在实际工程中,如果方法被多次调用,记得在每次调用前清空列表,或者将列表作为参数传递。
2. 迭代实现
递归依赖系统栈,当树很深时可能溢出。迭代法利用显式栈(Stack)来模拟这个过程。
关键点在于入栈顺序。因为栈是后进先出(LIFO),为了先访问左子树,我们需要先压入右子节点,再压入左子节点。
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if (root == null) return list;
Deque<TreeNode> stack = new LinkedList<>();
stack.push(root);
while (!stack.isEmpty()) {
stack.pop();
(node == ) ;
list.add(node.val);
(node.right != ) stack.push(node.right);
(node.left != ) stack.push(node.left);
}
list;
}
}


