二叉树前中后序遍历详解
二叉树遍历是数据结构中的基础操作,主要包括前序、中序和后序三种方式。每种方式都可以通过递归和迭代两种思路实现。递归写法代码简洁,但受限于系统栈深度;迭代法则利用显式栈模拟递归过程,更稳健。以下基于 Java 语言,详细解析这三种遍历的核心逻辑与代码实现。
一、二叉树的前序遍历
前序遍历的顺序为:根节点 → 左子树 → 右子树。
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);
}
}
}
2. 迭代实现
迭代法借助栈来模拟递归调用栈。由于栈是后进先出(LIFO),为了保持'根 - 左 - 右'的顺序,入栈时需要先压入右子节点,再压入左子节点,这样弹出时才能先访问左子树。
关键逻辑:
- 初始化栈并将根节点压入。
- 循环直到栈空:弹出栈顶,访问该节点,然后按'右 -> 左'顺序将其非空子节点压栈。
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;
}
}


