0144.二叉树的前序遍历

难度:🟢 简单

标签深度优先搜索二叉树递归

链接144. 二叉树的前序遍历

题目描述

给你二叉树的根节点 root ,返回它节点值的 前序遍历

示例 1:

输入:root = [1,null,2,3]
输出:[1,2,3]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

解题思路

核心思想

本题的核心是实现二叉树的 前序遍历。前序遍历的访问顺序是:根节点 -> 左子树 -> 右子树。这种遍历方式会优先访问每一棵子树的根节点。

思路选择

递归法 是实现前序遍历最直接、最简洁的方式。算法的结构直接遵循了前序遍历的定义(根-左-右),代码逻辑清晰。

关键步骤

  1. 递归的终止条件 (Base Case):如果当前节点 rootnull,意味着到达了树的尽头,没有节点可访问,直接返回一个空数组。

  2. 递归分解: a. 首先,访问 根节点,获取其值 root.val。 b. 接着,递归地对当前节点的 左子树 进行前序遍历,获取左子树的遍历结果。 c. 最后,递归地对当前节点的 右子树 进行前序遍历,获取右子树的遍历结果。

  3. 结果合并:按照“根-左-右”的顺序,将根节点的值、左子树的遍历结果、右子树的遍历结果拼接起来,形成最终的前序遍历序列。

代码实现

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 * this.val = (val===undefined ? 0 : val)
 * this.left = (left===undefined ? null : left)
 * this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var preorderTraversal = function (root) {
    if (root === null) return [];

    return [root.val, ...preorderTraversal(root.left), ...preorderTraversal(root.right)];
};

复杂度分析

  • 时间复杂度O(n) 其中 n 是树的节点总数。每个节点都会被访问一次。

  • 空间复杂度O(h) 其中 h 是树的高度。空间复杂度主要由递归调用栈的深度决定。在最坏情况下(树退化为一条链),空间复杂度为 O(n);在最好的情况下(一个完全平衡的树),空间复杂度为 O(log n)。

相关题目

总结

前序遍历是三种主要的深度优先遍历方式之一,常用于创建树的副本或序列化树的结构。其递归实现非常直观,是学习树遍历算法的起点。与中序和后序遍历一样,前序遍历也可以通过迭代(使用栈)的方式来实现,这也是面试中需要掌握的技能。

Copyright © Jun 2025 all right reserved,powered by Gitbook该文件修订时间: 2025-07-03 17:35:08

results matching ""

    No results matching ""

    results matching ""

      No results matching ""