LeetCode 「简单」144.二叉树的前序遍历

sankigan2025-3-24算法LeetCode

二叉树的前序遍历open in new window

题目描述

给定一个二叉树的根节点 root ,返回 它的 前序 遍历 。

示例

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

输入:root = [1,2,3,4,5,null,8,null,null,6,7,9]
输出:[1,2,4,5,6,7,3,8,9]

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

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

解答

递归

Code
/**
 * 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) return [];

  const result = [];
  const dfs = (node) => {
    if (!node) return;

    result.push(node.val);
    dfs(node.left);
    dfs(node.right);
  };

  dfs(root);
  return result;
};

迭代

思路

  1. 使用栈
  • 使用一个栈来模拟递归调用的过程
  • 栈用于存储尚未处理的节点
  1. 初始化
  • 将根节点压入栈中
  1. 遍历逻辑
  • 当栈不为空时,执行以下操作:
    • 弹出栈顶节点,访问该节点(将其值添加到结果数组中)
    • 将右子节点压入栈(如果存在)
    • 将左子节点压入栈(如果存在)
  • 由于栈是后进先出(LIFO)结构,先压入右子节点,再压入左子节点,这样在弹出时左子节点会先被处理
  1. 结果数组
  • 通过上述逻辑,结果数组将按照前序遍历的顺序存储所有节点的值
Code
/**
 * 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) return [];

  const result = []; // 用于存储遍历结果
  const stack = [root]; // 初始化栈,将根节点压入栈

  while (stack.length) {
    const node = stack.pop(); // 弹出栈顶节点
    result.push(node.val); // 访问当前节点

    // 先压入右子节点,再压入左子节点
    if (node.right) stack.push(node.right);
    if (node.left) stack.push(node.left);
  }

  return result;
};
更新于 2025/3/24 22:10:56