news 2026/7/6 8:08:20

C++算法:队列与BFS

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++算法:队列与BFS

队列与BFS

1.N叉树的层序遍历

使用BFS,即宽度优先搜索。把节点放入队列中,当节点出队列时让其孩子节点入队列,记录每层节点数量。

classSolution{public:vector<vector<int>>levelOrder(Node*root){vector<vector<int>>ret;queue<Node*>q;if(root==nullptr)returnret;q.push(root);while(!q.empty()){vector<int>v;intlen=q.size();//当前层节点数量for(inti=0;i<len;i++){Node*p=q.front();q.pop();v.push_back(p->val);for(Node*child:p->children)//下一层节点入队列if(child!=nullptr)q.push(child);}ret.push_back(v);}returnret;}};

2.二叉树的锯齿形层序遍历

与上一题相似,锯齿形层序遍历时,可以照常从左到右遍历,把第一层记为level=1,每偶数层时逆序数组即可。也可以使用别的方法,只要能在偶数层逆序即可。

/** * 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) {} * }; */classSolution{public:vector<vector<int>>zigzagLevelOrder(TreeNode*root){vector<vector<int>>ret;queue<TreeNode*>q;intflag=1;// 规定flag<0小于时逆序数组。if(root==nullptr)returnret;q.push(root);while(!q.empty()){intlen=q.size();vector<int>v;for(inti=0;i<len;i++){TreeNode*p=q.front();q.pop();v.push_back(p->val);if(p->left)q.push(p->left);if(p->right)q.push(p->right);}if(flag<0)//判断是否逆序数组reverse(v.begin(),v.end());flag*=-1;ret.push_back(v);}returnret;}};

3.二叉树最大宽度

根据题意,如果直接按照前面题目的模板,会出现超出内存限制的情况。如下图所示,3000个节点分别位于两侧,中间全为空节点。

此时可以考虑树的顺序存储。即给树的每个节点从左到右,从上到下编号,如果从1开始编号,某个节点下标为x,则它的孩子节点为2x和2x+1。依旧使用循环+队列的模板,非空节点入队列,队列元素应使用pair类型,记录节点及其下标,每次循环取队头和队尾的下标做差再加1,即可求出一层的宽度。

题目保证最终的宽度在32位带符号的整数范围内,如果用int做差返回的宽度错误,用unsigned int则能够正确返回宽度。

classSolution{public:intwidthOfBinaryTree(TreeNode*root){queue<pair<TreeNode*,unsignedint>>q;unsignedintret=0;q.push({root,1});while(!q.empty()){autoe1=q.front();autoe2=q.back();ret=max(ret,e2.second-e1.second+1);size_t len=q.size();for(inti=0;i<len;i++){autop=q.front();q.pop();if(p.first->left)q.push({p.first->left,p.second*2});if(p.first->right)q.push({p.first->right,p.second*2+1});}}returnret;}};

4.在每个树行中找最大值

与1、2题类似。只需用一个变量在遍历时记录最大值即可。

classSolution{public:vector<int>largestValues(TreeNode*root){queue<TreeNode*>q;vector<int>ret;if(root==nullptr)returnret;q.push(root);while(!q.empty()){intMax=INT_MIN;size_t len=q.size();for(inti=0;i<len;i++){TreeNode*p=q.front();q.pop();if(Max<p->val)Max=p->val;if(p->left)q.push(p->left);if(p->right)q.push(p->right);}ret.push_back(Max);}returnret;}};
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 8:08:19

AI Agent工程化实战:灰度放量、版本兼容与自动化测试

&#x1f680; 30款热门AI模型一站整合&#xff0c;DeepSeek/GLM/Qwen 随心用&#xff0c;限时 5 折。 &#x1f449; 点击领海量免费额度 如果你正在准备冲击30K的资深AI岗位&#xff0c;或者已经是团队里的技术骨干&#xff0c;那么“Agent灰度放量”、“版本兼容”和“自…

作者头像 李华
网站建设 2026/7/6 8:07:44

455. Java 反射 - 核心 Class 类

文章目录455. Java 反射 - 核心 Class 类1. 什么是 Class 类&#xff1f;2. 获取 Class 对象的三种标准方式代码示例&#xff1a;3. 不同类型的 Class 表现4. ClassLoader&#xff1a;类的加载器加载器层级&#xff1a;示例代码&#xff1a;5. 总结455. Java 反射 - 核心 Class…

作者头像 李华
网站建设 2026/7/6 8:07:08

GPT-5.6三大模型全曝,定档7月7日?

突发偷跑&#xff01;GPT-5.6三大神秘模型底层代码曝光&#xff0c;下周二重磅降临。这一波&#xff0c;OpenAI是卡点截杀Claude&#xff0c;用超高额度「趁火打劫」。7月7日&#xff0c;有大事要发生。 GPT-5.6&#xff0c;将于下周发布&#xff1f; 就在昨天&#xff0c;网友…

作者头像 李华
网站建设 2026/7/6 8:05:27

高效C++线程池设计与实现

在高性能服务器和实时系统中&#xff0c;线程的创建与销毁开销往往成为瓶颈。线程池&#xff08;Thread Pool&#xff09;预先创建并维护一组工作线程&#xff0c;通过任务队列复用线程执行计算任务&#xff0c;能够显著降低上下文切换和资源分配延迟。然而&#xff0c;一个“能…

作者头像 李华
网站建设 2026/7/6 8:05:05

基于GPT-5.5的开源RAG框架性能对比与选型建议:企业级知识库怎么选?

大模型落地进入下半场&#xff0c;企业级RAG&#xff08;检索增强生成&#xff09;已成为标配。最近&#xff0c;很多开发者都在探索如何利用GPT-5.5的超长上下文和强推理能力升级现有的知识库方案。为了验证不同框架在最新大模型下的适配度&#xff0c;我通过AI模型聚合平台 y…

作者头像 李华
网站建设 2026/7/6 8:04:56

让AI Agent拥有本地永久记忆:零费用且中文友好的解决方案

让你的 AI Agent 拥有永不遗忘的长期记忆。一行命令接入&#xff0c;零 API 费用&#xff0c;数据 100% 本地存储。 前言&#xff1a;AI Agent 的"金鱼记忆"之痛 用过 Claude Code、Cursor、Cline、Hermes 等 AI 编程助手的同学一定有过这种体验&#xff1a; 上次告…

作者头像 李华