
核心思路(一句话讲透)
用队列来实现 "一层一层处理":
- 先把根节点放进队列;
- 每次循环,先记录当前队列里有多少个节点(这就是当前层的节点数);
- 把这些节点一个一个取出来,记录它们的值,同时把它们的左右孩子(如果有的话)按顺序放进队列;
- 重复步骤 2-3,直到队列为空。
为什么用队列? 因为队列是 ** 先进先出(FIFO)** 的结构,正好符合 "先访问的节点,它的孩子也先被访问" 的层序遍历要求。如果用栈(后进先出),就会变成深度优先遍历了。
完整解题步骤
- 初始化结果数组 :
vector<vector<int>> ret,用来存储每一层的节点值。 - 边界处理:如果根节点是空节点,直接返回空的结果数组。
- 初始化队列 :
queue<TreeNode*> q,把根节点root入队。 - 外层循环(处理每一层) :当队列不为空时:
- 记录当前队列的大小
currentLevelSize(这就是当前层的节点数); - 往结果数组里添加一个空的一维数组,用来存储当前层的节点值;
- 内层循环(处理当前层的所有节点) :循环
currentLevelSize次:- 取出队首节点
node; - 把
node->val添加到结果数组的最后一个一维数组里; - 如果
node有左孩子,把左孩子入队; - 如果
node有右孩子,把右孩子入队;
- 取出队首节点
- 记录当前队列的大小
- 返回结果数组。
cpp
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ret;//存最终的结果
if(root ==nullptr){
return ret;
}
//不为空的话就继续
//创建一个队
queue <TreeNode*> q;
q.push(root);
//进入循环
while(!q.empty()){
ret.push_back(vector<int>());
int nums = q.size();//每一层的个数
for(int i = 0;i<nums;i++){
TreeNode * nod = q.front();
q.pop();
ret.back().push_back(nod->val);
if(nod->left) q.push(nod->left);
if(nod->right) q.push(nod->right);
}
}
return ret;
}
};