c++中如何实现二叉树的层序遍历_c++使用队列实现BFS遍历【实例】
技术百科
尼克
发布时间:2026-01-20
浏览: 次 层序遍历必须用队列而非栈,因其FIFO特性保证“从上到下、从左到右”的访问顺序;栈的LIFO会导致根-右-左的深度优先变体,破坏层级结构。
为什么层序遍历必须用队列而不是栈
因为层序遍历要求「从上到下、从左到右」逐层访问,而队列的 FIFO 特性天然匹配这一顺序;若误用栈(LIFO),实际得到的是“根-右-左”的逆向深度优先变体,不是真正的 BFS。
常见错误现象:std::stack 替代 std::queue 后输出节点顺序混乱,同一层节点被拆散到不同层级中。
- 必须包含头文件:
#include - 队列元素类型要与树节点指针类型一致,通常是
std::queue - 空指针必须跳过,否则解引用会触发
segmentation fault
标准实现:用 std::queue 做一次完整 BFS
核心逻辑是每次循环处理当前队列中「所有尚未展开的同层节点」,即先记录队列长度,再循环出队、访问、入队子节点。
关键点在于不能在循环中直接用 q.size() 判断终止条件——因为循环体内会动态修改队列大小,导致提前退出或无限循环。
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
std::vector levelOrder(TreeNode* root) {
std::vector result;
if (!root) return result;
std::queuezuojiankuohaophpcnTreeNode*youjiankuohaophpcn q;
q.push(root);
while (!q.empty()) {
int levelSize = q.size(); // 必须提前缓存!
for (int i = 0; i zuojiankuohaophpcn levelSize; ++i) {
TreeNode* node = q.front();
q.pop();
result.push_back(node-youjiankuohaophpcnval);
if (node-youjiankuohaophpcnleft) q.push(node-youjiankuohaophpcnleft);
if (node-youjiankuohaophpcnright) q.push(node-youjiankuohaophpcnright);
}
}
return result;}
按层分组返回二维 vector 的写法差异
和一维结果相比,只需把每轮 for 循环内的 result.push_back(...) 改为构造临时 level vector,并在循环结束后整体 push_back 到外层容器。
参数差异:std::vector<:vector>> 返回类型;性能影响几乎可忽略,仅多一次 vector 构造开销。
- 不要在内层循环里反复调用
result.back().push_back()—— 容易因未初始化引发越界 - 如果题目要求空层也保留(如完全二叉树补空),需额外标记或改用带 nullptr 占位的入队策略
容易被忽略的边界情况
真正上线或刷题时崩得最突然的往往不是算法主干,而是这些细节:
-
root == nullptr时立即返回空容器,不进 while 循环 - 单节点树(
root无左右子)不会触发任何 push,但q.size() == 1仍会执行一次循环
- LeetCode 上部分题目的
TreeNode定义含默认构造函数,但自定义结构体若未显式初始化left/right为nullptr,会导致野指针 - 使用
std::queue时禁止对已出队的node指针再次解引用(例如重复 push 或后续访问)
最后一句提醒:BFS 本身不递归,但如果你在循环里又调用了递归函数来处理子树,就不再是纯层序了——那是在混淆遍历模型。
# 是在
# 的是
# 你在
# 这一
# 只需
# 一句
# 循环
# 递归
# 递归函数
# c++
# int
# 指针
# 构造函数
# 为什么
# 栈
# node
# 结构体
# 算法
# while
# 指针类型
# 空指针
# 遍历
# for
# 子树
# include
# leetcode
# 从上到下
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Golang如何遍历目录文件_Golang fil
- Win11键盘快捷键大全_Windows 11常用
- Linux怎么查找死循环进程_Linux系统负载分
- Win10闹钟铃声怎么自定义 Win10闹钟自定义
- php订单日志怎么记录发货_php记录订单发货操作
- Win11怎样彻底卸载自带应用_Win11彻底卸载
- Win10怎么更改用户名 Win10修改账户名称操
- 本地php环境出现502错误_nginx或apac
- MAC怎么截图并快速编辑_MAC自带截图快捷键与标
- Win10系统怎么查看网络连接状态_Windows
- Windows10如何更改任务栏高度_Win10解
- 如何使用Golang构建基础消息队列模拟_Gola
- Python技术债务管理_长期维护解析【教程】
- Go 中的 := 运算符:类型推导机制与使用边界详
- Go语言中slice追加操作的底层共享机制详解
- windows如何测试网速_windows系统网络
- 如何处理“XML格式不正确”错误 常见XML we
- 如何将竖排文本文件转换为横排字符串
- php订单日志怎么在swoole写_php协程sw
- Windows10如何更改鼠标灵敏度_Win10鼠
- php转exe用什么工具打包快_高效打包软件推荐【
- 如何使用Golang开发基础文件下载功能_Gola
- php删除数据怎么清空表_truncate与del
- c++怎么编写动态链接库dll_c++ __dec
- Python字符串处理进阶_切片方法解析【指导】
- XML的“混合内容”是什么 怎么用DTD或XSD定
- Win11怎么设置右键刷新选项_Windows11
- Win11怎么关闭任务栏小组件_Windows11
- Linux如何安装JDK11_Linux环境变量配
- 如何使用Golang log设置日志输出格式_Go
- Mac如何修改Hosts文件?(本地开发与屏蔽网站
- c++中如何使用std::variant_c++1
- 如何在Golang中使用replace替换模块_指
- Win11怎么更改系统语言为中文_Windows1
- Windows怎样关闭Edge新标签页广告_Win
- 如何使用Golang搭建Web开发环境_快速启动H
- Windows10电脑怎么查看硬盘通电时间_Win
- Windows10如何更改计算机工作组_Win10
- 如何使用Golang理解结构体指针方法接收者_Go
- Mac如何将HEIC图片格式转为JPG_Mac批量
- Win11怎么设置默认浏览器Chrome_Wind
- Win11时间怎么同步到原子钟 Win11高精度时
- Win11无法拖拽文件到任务栏怎么办_Win11开
- Python文本编码与解码_跨平台解析说明【指导】
- C++如何将C风格字符串(char*)转换为std
- php下载安装选zip还是msi格式_两种安装包对
- Win11怎么设置ipv4地址_Windows 1
- C#如何使用XPathNavigator高效查询X
- mac怎么查看wifi密码_MAC查看已连接WiF
- PythonFastAPI项目实战教程_API接口


QQ客服