二叉树前中后序遍历详解
一、二叉树的前序遍历
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<>();
(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;
}
}


