当前位置: 首页 > news >正文

BFS:队列+树的宽搜

一、二叉树的层序遍历

. - 力扣(LeetCode)

       该题的层序遍历和以往不同的是需要一层一层去遍历,每一次while循环都要知道在队列中节点的个数,然后用一个for循环将该层节点走完了再走下一层

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> ret;queue<TreeNode*> q;if(root==nullptr) return ret;q.push(root);while(!q.empty()){int sz=q.size();//帮助我们控制一层一层出  因为上一层出完,下一层已经进去了vector<int> path;//统计结果for(int i=0;i<sz;++i){TreeNode*t=q.front();q.pop();path.push_back(t->val);if(t->left) q.push(t->left);if(t->right) q.push(t->right);}ret.push_back(path);;}return ret;}
};

 二、N叉树的层序遍历

. - 力扣(LeetCode)

class Solution {
public:vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> ret;//记录最终的返回结果if(root==nullptr) return ret;queue<Node*> q;//层序遍历所需要的队列q.push(root);//先将根节点插入进去while(!q.empty()) //因为统计的是每层,所以我们没进去一次就要去统计一层。{int sz=q.size();//pop根节点的同时让他的孩子入队 //将左右孩子入队vector<int> path;//记录每层的结果for(int i=0;i<sz;++i){Node* t=q.front();q.pop();path.push_back(t->val);//开始让后面的节点入队for(Node* &child:t->children) if(child!=nullptr) q.push(child);}ret.push_back(path);}return ret;}
};

三、二叉树的锯齿形层序遍历

. - 力扣(LeetCode)

设置一个变量编辑层数,单层的不处理,双层的将path数组进行翻转

class Solution {
public:vector<vector<int>> zigzagLevelOrder(TreeNode* root){vector<vector<int>> ret;//帮助我们记录要返回的数组queue<TreeNode*> q;//层序遍历需要的队列if(root==nullptr) return ret;q.push(root);int k=1;//标记位while(!q.empty()){int sz=q.size();vector<int> path;//记录要插入的结果for(int i=0;i<sz;++i){TreeNode*t=q.front();//删除前拿到队头节点q.pop();path.push_back(t->val);//将结果插入进去if(t->left) q.push(t->left);if(t->right) q.push(t->right); }if(k%2==0) reverse(path.begin(),path.end());++k;ret.push_back(path);}return ret;}
};

四、每个树行中找最大值

. - 力扣(LeetCode)

层序遍历的时候更新一下最大值即可! 

class Solution {
public:vector<int> largestValues(TreeNode* root) {vector<int> ret;if(root==nullptr) return ret;queue<TreeNode*> q;q.push(root);while(!q.empty()){size_t n=q.size();//统计当前层int temp=INT_MIN;for(size_t i=0;i<n;++i){TreeNode*t=q.front();q.pop();temp=max(temp,t->val);//更新最大值//将孩子进队列if(t->left) q.push(t->left);if(t->right) q.push(t->right);}ret.emplace_back(temp);}return ret;}
};

五、二叉树的最大宽度(非常经典)

. - 力扣(LeetCode)

细节1:下标可能溢出

关键是这里借助无符号整型在溢出的时候自动根据32位,或者64位取模。

细节2:利用数组的存储方式给节点编号+移动赋值(右值引用提高效率)

 用vector模拟queue 把孩子和其对应的下标存在数组中,每一层处理完再进行移动赋值。

class Solution {
public:typedef pair<TreeNode*,unsigned int> PTU;int widthOfBinaryTree(TreeNode* root) {//用队列 直接连空节点也丢 超时//用数组模拟vector<PTU> q;//用数组来模拟队列q.emplace_back(root,1);unsigned int ret=1; //减掉之后不会影响结果while(!q.empty()){//先更新一下长度auto&[x1,y1]=q[0];auto&[x2,y2]=q.back();ret=max(ret,y2-y1+1);//用一个新的数组入队vector<PTU> temp;//用数组来模拟队列//让下一层进队列for(auto&[x,y]:q){if(x->left) temp.emplace_back(x->left,y*2); //插入pair类型可以体现出emplace_back//和push_back的区别 push_back({x->left,y*2})if(x->right) temp.emplace_back(x->right,y*2+1);}//更新一个新的数组q=move(temp); //移动赋值  窃取资源 效率更高}return ret;}
};

http://www.lryc.cn/news/386005.html

相关文章:

  • MySQL高级-SQL优化- count 优化 - 尽量使用count(*)
  • python Flask methods
  • three.js场景三元素
  • Spring AOP(面向切面编程)详解
  • Kafka第一篇——内部组件概念架构启动服务器zookeeper选举以及底层原理
  • 14、顺时针打印矩阵
  • 毅速丨金属3D打印是制造业转型升级的重要技术
  • uni-app uni-data-picker级联选择器无法使用和清除选中的值
  • 构造函数的小白理解
  • 招聘,短信与您:招聘人员完整指南
  • JAVA-矩阵置零
  • [信号与系统]模拟域中的一阶低通滤波器和二阶滤波器
  • Mac环境 aab包转apks,并安装apks
  • 银河麒麟V10 SP1.1操作系统 离线安装 nginx1.21.5、redis 服务
  • ios swift5 视频播放 播放视频失败 无法播放HEVC (H.265) 格式的视频 H.264格式的可以播放
  • 网工内推 | 网络工程师,IE认证优先,最高18k*14薪,周末双休
  • 【Qt】QMessageBox 各种对话框的默认显示效果
  • 一文弄懂线性回归模型
  • uniApp获取实时定位
  • linux的source命令
  • 特种作业操作证(焊接与热切割作业)2024年理论考试题库。
  • 免交互和嵌入执行模式
  • Hadoop版本演变、分布式集群搭建
  • 【Qt C++实现绘制仪表盘】
  • 一文看懂LLaMA 2:大型多模态模型的新里程碑
  • 基于Spring Boot构建淘客返利平台
  • Qt—贪吃蛇项目(由0到1实现贪吃蛇项目)
  • Java导出Excel并邮件发送
  • 【课程总结】Day12:YOLO的深入了解
  • 保护隐私,释放智能:使用LangChain和Presidio构建安全的AI问答系统