555 字
3 分钟
二叉树的层序遍历

题目描述#

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

解题思路#

叉树的层次遍历解题思路#

  1. 队列辅助
    • 使用队列(FIFO)存储待访问节点
    • 初始将根节点入队
  2. 分层处理
    • 记录当前层节点数(队列长度)
    • 遍历当前层所有节点,访问值并存入结果
  3. 子节点入队
    • 将当前节点的左/右子节点(非空)加入队列
  4. 迭代推进
    • 完成一层后推进到下一层
    • 队列为空时终止

关键洞察#

  1. 队列核心作用
    • 队列保证先进先出,实现层级顺序访问
    • 队首始终是当前层最左侧节点
  2. 层尺寸记录
    • 每层开始前记录队列长度 = 当前层节点数
    • 确保精准分层收集结果
  3. 空值优化
    • 跳过空子节点不入队,减少无效操作
  4. 空间效率
    • 队列最大尺寸不超过最宽层节点数
    • 完美树时空间复杂度最低

复杂度分析#

指标说明
时间复杂度O(n):每个节点进出队列各一次
空间复杂度O(w):w为树最大宽度(队列存储节点数不超过最宽层节点数)

:n为节点总数,w为二叉树最大宽度(叶子最多的一层)

代码实现#

/**
* 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 levelOrder = function (root) {
if(!root) return [];
const result = []
const queue = [root]
while (queue.length) {
const item = []
const size = queue.length
for (let i = 0; i < size; i++) {
const node = queue.pop()
item.push(node.val)
if (node.left) queue.unshift(node.left)
if (node.right) queue.unshift(node.right)
}
result.push(item)
}
return result
};

相似题目#

二叉树的层序遍历
https://website-truelovings-projects.vercel.app/posts/algorithms/二叉树的层序遍历/
作者
欢迎来到StarSky的网站!
发布于
2025-08-11
许可协议
CC BY-NC-SA 4.0