LeetCode 144. 二叉树的前序遍历
题目描述
思路分析
解法一:迭代(推荐)
核心思路:
- 前序遍历顺序为 根 → 左子树 → 右子树。
- 用显式栈模拟递归调用栈,每次弹出栈顶节点并记录其值。
- 压栈时先压右子节点,再压左子节点,确保左子节点先弹出,从而保证前序遍历顺序。
复杂度分析:
- 时间复杂度:O(n),其中 n 为节点数,每个节点恰好入栈、出栈各一次
- 空间复杂度:O(n),其中 n 为节点数,栈的最大空间为树的宽度
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if (root == null) {
return res;
}
Deque<TreeNode> stack = new ArrayDeque<>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
// 访问根节点
res.add(node.val);
// 先压右子节点,再压左子节点,保证左子节点先弹出
if (node.right != null) {
stack.push(node.right);
}
if (node.left != null) {
stack.push(node.left);
}
}
return res;
}
}
func preorderTraversal(root *TreeNode) []int {
if root == nil {
return nil
}
var res []int
stack := []*TreeNode{root}
for len(stack) > 0 {
// 弹出栈顶节点
node := stack[len(stack)-1]
stack = stack[:len(stack)-1]
// 访问根节点
res = append(res, node.Val)
// 先压入右子节点,再压入左子节点,保证左子节点先弹出
if node.Right != nil {
stack = append(stack, node.Right)
}
if node.Left != nil {
stack = append(stack, node.Left)
}
}
return res
}
解法二:递归
核心思路:
- 递归函数
dfs(node)按照根 → 左 → 右的顺序访问节点。- 若当前节点为空则直接返回,否则先记录根节点值,再递归处理左、右子树。
复杂度分析:
- 时间复杂度:O(n),其中 n 为节点数,每个节点恰好访问一次
- 空间复杂度:O(h),其中 h 为树的高度,最坏情况(链状树)退化为 O(n)
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
dfs(root, res);
return res;
}
private void dfs(TreeNode node, List<Integer> res) {
if (node == null) {
return;
}
// 根 → 左 → 右
res.add(node.val);
dfs(node.left, res);
dfs(node.right, res);
}
}
func preorderTraversal(root *TreeNode) []int {
var res []int
var dfs func(node *TreeNode)
dfs = func(node *TreeNode) {
if node == nil {
return
}
// 根 → 左 → 右
res = append(res, node.Val)
dfs(node.Left)
dfs(node.Right)
}
dfs(root)
return res
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 94. 二叉树的中序遍历 | 简单 | 中序遍历迭代/递归 |
| 145. 二叉树的后序遍历 | 简单 | 后序遍历迭代/递归 |
| 102. 二叉树的层序遍历 | 中等 | BFS 层序遍历 |
| 589. N 叉树的前序遍历 | 简单 | N 叉树前序遍历 |
| 590. N 叉树的后序遍历 | 简单 | N 叉树后序遍历 |
| 897. 递增顺序搜索树 | 简单 | 中序遍历重构 |
| 173. 二叉搜索树迭代器 | 中等 | 中序遍历迭代器 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!

