news 2026/4/7 5:53:16

刷题日记-------二叉树层序遍历

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
刷题日记-------二叉树层序遍历

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

示例 1:

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

示例 2:

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

示例 3:

输入:root = []输出:[]
class Solution { public: vector<vector<int>> levelOrder(TreeNode* root) { queue<TreeNode*>que; if(root!=NULL) que.push(root); vector<vector<int>> result; while(!que.empty()){ int size=que.size(); vector<int> vec; for(int i=0;i<size;i++){ TreeNode* node =que.front(); que.pop(); vec.push_back(node->val); if(node->left) que.push(node->left); if(node->right) que.push(node->right); } result.push_back(vec); } return result; } };

好,这段代码是二叉树的层序遍历(Level Order Traversal),也就是一层一层从上到下、从左到右遍历
我按「思路 → 关键数据结构 → 逐行语法讲解 → 小例子跑一遍」来给你拆,像老师板书那种 👍


一、整体思路(先别看语法)

一句话版👇

用队列(queue)保存“当前层的节点”,每次处理完这一层,再处理下一层

为什么用队列?

  • 队列:先进先出(FIFO)

  • 非常适合「先看到谁就先处理谁」→ 正好符合层序遍历


二、要用到的东西你得先认识

1️⃣queue<TreeNode*>

queue<TreeNode*> que;
  • 队列里放的是:TreeNode 指针

  • 存的是“还没处理的节点”

2️⃣vector<vector<int>> result

vector<vector<int>> result;
  • 最终结果

  • 外层vector:每一层

  • 内层vector<int>:这一层的所有节点值


三、逐行“老师式”讲解

我把代码拆开讲 👇


① 函数入口

vector<vector<int>> levelOrder(TreeNode* root)
  • root:二叉树的根节点

  • 返回值:二维数组

    • [[第一层], [第二层], [第三层]...]


② 建立队列 + 判空

queue<TreeNode*> que; if(root != NULL) que.push(root);
  • 如果树不空,把根节点放进队列

  • 这是第一层的起点

📌 如果root == NULL

  • 队列是空的

  • 下面的while直接跳过

  • 返回空结果(合理)


③ 结果容器

vector<vector<int>> result;

用来保存所有层的结果


④ 外层 while —— 一层一层来

while(!que.empty())

👉队列不空,就说明还有节点没遍历

⚠️ 重点:
一次 while 循环 = 处理一整层


⑤ 当前层有多少节点(核心语句)

int size = que.size();

🔥 非常关键的一行!

  • size=当前层节点数

  • 这一层的节点,在进入for之前就已经确定了


⑥ 存当前层的结果

vector<int> vec;
  • 用来存「这一层」的所有值


⑦ for 循环 —— 只处理当前层

for(int i = 0; i < size; i++)

为什么不是while

  • 因为:

    • size当前层固定数量

    • 即使你在循环里push了孩子节点

    • 也不会影响本层遍历


⑧ 取队头节点

TreeNode* node = que.front(); que.pop();
  • front():取最前面的节点

  • pop():从队列中移除

📌 这就是FIFO(先进先出)


⑨ 保存当前节点的值

vec.push_back(node->val);
  • 把当前节点值放进本层vec


⑩ 把下一层节点加入队列

if(node->left) que.push(node->left); if(node->right) que.push(node->right);
  • 左孩子、右孩子不为空 → 加入队列

  • ⚠️ 注意:
    它们是下一层的节点


⑪ 当前层结束,放入 result

result.push_back(vec);
  • 一整层处理完

  • 把这一层的结果加入最终答案


⑫ 返回结果

return result;

四、用一个例子跑一遍(超重要)

假设二叉树是:

1 / \ 2 3 / / 4 5

初始:

队列: [1] result:[]

第一轮 while

  • size = 1

  • 处理1

  • 加入2, 3

vec = [1] 队列 = [2, 3] result = [[1]]

第二轮 while

  • size = 2

  • 处理2 → 加 4

  • 处理3 → 加 5

vec = [2, 3] 队列 = [4, 5] result = [[1], [2, 3]]

第三轮 while

  • size = 2

  • 处理4

  • 处理5

vec = [4, 5] 队列 = [] result = [[1], [2, 3], [4, 5]]

结束 🎉


五、你现在至少要记住这 3 点

1️⃣层序遍历 = 队列
2️⃣size = que.size()是分层的关键
3️⃣while 管层,for 管层内

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/6 13:53:29

大族数控通过注册:10个月营收43亿,利润5亿 高云峰控制84%权益

雷递网 雷建平 1月19日深圳市大族数控科技股份有限公司&#xff08;简称&#xff1a;“大族数控”&#xff09;日前通过注册&#xff0c;准备在港交所上市。大族数控已于2022年2月在深交所上市&#xff0c;截至今日收盘&#xff0c;大族数控股价138.43元&#xff0c;市值589亿元…

作者头像 李华
网站建设 2026/3/21 14:58:52

DeepSeek-R1-Distill-Qwen-1.5B部署失败?常见问题排查步骤详解

DeepSeek-R1-Distill-Qwen-1.5B部署失败&#xff1f;常见问题排查步骤详解 1. 引言&#xff1a;为什么选择DeepSeek-R1-Distill-Qwen-1.5B&#xff1f; 在边缘计算与本地化AI应用快速发展的今天&#xff0c;如何在有限硬件资源下实现高性能推理成为开发者关注的核心问题。Dee…

作者头像 李华
网站建设 2026/4/4 2:07:34

Qwen3Guard-Gen-8B输出控制:置信度阈值设置实战教程

Qwen3Guard-Gen-8B输出控制&#xff1a;置信度阈值设置实战教程 1. 引言 1.1 业务场景描述 在当前大模型广泛应用的背景下&#xff0c;生成内容的安全性已成为企业部署AI系统时的核心关注点。无论是客服对话、内容推荐还是用户交互式应用&#xff0c;模型输出若包含不当、敏…

作者头像 李华
网站建设 2026/3/26 2:05:24

PyTorch-2.x-Universal-Dev-v1.0完整指南:实验结果可复现性保障措施

PyTorch-2.x-Universal-Dev-v1.0完整指南&#xff1a;实验结果可复现性保障措施 1. 引言 在深度学习研究与工程实践中&#xff0c;实验结果的可复现性是衡量模型可靠性、算法有效性和团队协作效率的核心标准。然而&#xff0c;由于随机性来源广泛&#xff08;如权重初始化、数…

作者头像 李华
网站建设 2026/3/27 12:04:22

AI初创公司首选:Qwen3-0.6B低成本验证产品可行性

AI初创公司首选&#xff1a;Qwen3-0.6B低成本验证产品可行性 随着大语言模型技术的快速发展&#xff0c;AI初创公司在产品早期阶段面临的核心挑战之一是如何在有限资源下快速验证产品可行性。在此背景下&#xff0c;轻量级、高性能的语言模型成为关键工具。Qwen3-0.6B作为通义…

作者头像 李华