c++用std::queue实现bfs层序遍历需三步:1.根节点入队;2.每轮先记q.size()冻结本层节点数;3.内层for循环处理该数量节点并仅对非空子节点入队,同时空树和nullptr须显式判空。

用 queue 实现 BFS 层序遍历,别手写队列
直接用 std::queue 就够了,不需要自己实现链表或数组队列。C++ 标准库的 queue 底层默认是 deque,插入和弹出都是 O(1),完全满足 BFS 要求。
常见错误是误用 std::stack 或循环里反复新建队列——这会导致只遍历根节点,或者漏掉某一层。
- 初始化时只 push 根节点:
q.push(root) - 每轮 while 循环前先记录当前队列大小(即本层节点数),避免边 pop 边 push 导致下一层混入本轮
- 空指针必须跳过:
if (!node) continue;,否则解引用会崩溃
按层分组输出时,for 循环长度必须固定
很多人写成 for (int i = 0; i ,这是错的——<code>q.size() 在循环中会动态变化,导致提前退出或越界。
正确做法是提前存快照:
int levelSize = q.size();
for (int i = 0; i left) q.push(node->left);
if (node->right) q.push(node->right);
}
这个细节在 LeetCode 题 #102(二叉树的层序遍历)里直接决定是否 AC。
NULL 节点不入队,但空树要特判
如果 root 是 nullptr,直接返回空结果(比如空 vector<vector>></vector>)。不要试图 push nullptr 进队列——虽然语法合法,但后续每次都要做空指针检查,逻辑变冗余且易漏。
- 入口处加判断:
if (!root) return {}; - 子节点入队前必须判空:
if (node->left),不是if (node->left != nullptr)(后者冗余) - 使用智能指针(如
shared_ptr<treenode></treenode>)时,判空仍用if (node),和裸指针写法一致
vector> 和 vector 的内存分配影响性能
如果提前知道最大层数或节点数,可以预分配外层 vector 容量,避免多次 realloc;但对一般题目没必要——BFS 本身是 O(n) 时间,动态扩容的摊还成本可忽略。
真正要注意的是:不要在每层 push_back 前反复调用 result[i].reserve(...),既无必要又容易索引越界。
更自然的写法是每层构造一个临时 vector<int></int>,处理完再 result.push_back(level)。
复杂点在于多叉树扩展或需要返回节点指针/结构体时,类型和内存生命周期得仔细对齐;纯整数值层序遍历,按上面三步走基本不会翻车。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











