/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return int整型vector<vector<>>
*/
vector<vector<int> > levelOrder(TreeNode* root) {
vector<vector<int>> result;
// 如果根节点为空,直接返回空结果
if (root == nullptr) {
return result;
}
// 使用队列进行层序遍历
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
// 获取当前层的节点数量
int levelSize = q.size();
// 创建当前层的子数组
vector<int> currentLevel;
// 遍历当前层的所有节点
for (int i = 0; i < levelSize; i++) {
TreeNode* node = q.front();
q.pop();
// 将节点值加入当前层
currentLevel.push_back(node->val);
// 将子节点加入队列
if (node->left != nullptr) {
q.push(node->left);
}
if (node->right != nullptr) {
q.push(node->right);
}
}
// 将当前层加入结果
result.push_back(currentLevel);
}
return result;
}
};
1. 问题本质分析
层序遍历的核心需求:按照"先遇到的节点先处理"的顺序遍历二叉树。
这正好符合先进先出(FIFO) 的特性:
先被访问的节点,它的子节点也应该先被访问
后加入的节点要等前面的节点处理完才能处理
第二步:寻找匹配的数据结构
栈(LIFO):后进先出,适合深度优先搜索
队列(FIFO):先进先出,正好匹配我们的需求
3. 与其他数据结构的对比
4. 队列的天然优势
队列完美解决了两个关键问题:
顺序保证:确保节点按发现的先后顺序处理
层次分离:通过记录每层开始时的队列大小,自然区分不同层次
6. 更广泛的模式识别
这种"用队列实现BFS"的模式在很多场景中都适用:
树的层序遍历
图的广度优先搜索
迷宫最短路径问题
社交网络中的朋友推荐
一旦你识别出问题是"按扩散顺序遍历"或"寻找最短路径",队列就是首选工具。
总结
选择队列不是偶然的,而是因为:
问题特性:层序遍历本质是广度优先,需要FIFO顺序
数据结构匹配:队列的FIFO特性正好满足需求
实现简洁性:队列操作简单直观,代码易于理解和维护
效率考虑:队列操作的时间复杂度都是O(1),整体算法O(n)