前序遍历(Preorder Traversal)

定义

前序遍历是二叉树遍历的一种方式,访问顺序为:根节点 → 左子树 → 右子树

在递归框架中,前序位置指的是刚进入一个二叉树节点的时候(递归调用之前)。

void traverse(TreeNode root) {
    if (root == null) return;
    // 前序位置:刚进入节点
    System.out.println(root.val);
    traverse(root.left);
    traverse(root.right);
}

核心特点

  1. 前序位置是进入节点的时候,此时只能从函数参数中获取父节点传递来的数据
  2. 前序位置适合做「选择」:类比 DFS 算法,做选择的逻辑放在 for 循环外面
  3. 快速排序的本质就是二叉树的前序遍历

与算法框架的联系

快速排序 = 前序遍历

void sort(int[] nums, int lo, int hi) {
    if (lo >= hi) return;
    // 前序位置:构造分界点
    int p = partition(nums, lo, hi);
    sort(nums, lo, p - 1);
    sort(nums, p + 1, hi);
}

前序遍历的两种实现思路

遍历思路(常规,用外部变量):

List<Integer> res = new LinkedList<>();

void traverse(TreeNode root) {
    if (root == null) return;
    res.add(root.val);  // 前序位置收集结果
    traverse(root.left);
    traverse(root.right);
}

分解问题思路(函数返回值):

List<Integer> preorderTraversal(TreeNode root) {
    List<Integer> res = new LinkedList<>();
    if (root == null) return res;
    res.add(root.val);
    res.addAll(preorderTraversal(root.left));
    res.addAll(preorderTraversal(root.right));
    return res;
}

相关概念


Interactive Graph