刷题日记-------二叉树层序遍历
2026/5/6 17:57:05 网站建设 项目流程

给你二叉树的根节点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 管层内

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询