LeetCode 144. 二叉树的前序遍历

题目描述

144. 二叉树的前序遍历

image-20230305165126109

image-20230305165122479

思路分析

解法一:迭代(推荐)

核心思路

  • 前序遍历顺序为 根 → 左子树 → 右子树
  • 用显式栈模拟递归调用栈,每次弹出栈顶节点并记录其值。
  • 压栈时先压右子节点,再压左子节点,确保左子节点先弹出,从而保证前序遍历顺序。


复杂度分析

  • 时间复杂度: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. 二叉搜索树迭代器 中等 中序遍历迭代器
本文作者:
本文链接: https://hgnulb.github.io/blog/2025/70801689
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!