导航菜单

二叉树的层序遍历

🟡 中等

题目描述

给你二叉树的根节点 root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。

示例 1

输入:root = [3, 9, 20, null, null, 15, 7]
输出:[[3], [9, 20], [15, 7]]

示例 2

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

示例 3

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

提示

  • 树中节点数目在范围 [0, 2000]
  • -1000 <= Node.val <= 1000

解法

参考答案 (3 个标签)
BFS 队列 O(n)

思路

使用队列进行广度优先搜索,每次处理一层的所有节点。

代码实现

/**
 * @param {TreeNode} root
 * @return {number[][]}
 */
function levelOrder(root) {
    if (root === null) return [];
    
    const result = [];
    const queue = [root];
    
    while (queue.length > 0) {
        const levelSize = queue.length;
        const currentLevel = [];
        
        for (let i = 0; i < levelSize; i++) {
            const node = queue.shift();
            currentLevel.push(node.val);
            
            if (node.left) queue.push(node.left);
            if (node.right) queue.push(node.right);
        }
        
        result.push(currentLevel);
    }
    
    return result;
}

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(w),w 为树的最大宽度

关键点

  1. 使用 levelSize 记录当前层的节点数
  2. 内层循环只处理当前层的节点
  3. 新加入的节点属于下一层

解法

参考答案 (3 个标签)
DFS 递归 O(n)

思路

递归时传递当前深度,将节点值添加到对应层的数组中。

代码实现

/**
 * @param {TreeNode} root
 * @return {number[][]}
 */
function levelOrder(root) {
    const result = [];
    
    function dfs(node, depth) {
        if (node === null) return;
        
        if (result.length === depth) {
            result.push([]);
        }
        
        result[depth].push(node.val);
        
        dfs(node.left, depth + 1);
        dfs(node.right, depth + 1);
    }
    
    dfs(root, 0);
    return result;
}

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(h)

搜索