7-1 内存分区分配--首次适应算法 (100 分)

一:题目7-1 内存分区分配–首次适应算法 (100 分) 宝 今天你看我博客了吗

输入内存的大小和阈值minsize,按照首次适应算法进行连续的分区分配。在划分时,若剩余的内存小于等于minsize,则将整块内存分配给该进程不再进行划分。 根据菜单选择相应的操作:

1.初始化:输入内存的大小和阈值minsize,初始状态下空闲分区名字为“void”。

2.分配:输入申请进程的名字、大小。

若可以分配,显示“分配成功!”;
若剩余空间不足,显示不分配原因“剩余空间不足,不予分配。”;
若剩余的空间通过紧凑技术,可以再分配,提示“是否通过紧凑技术,重新划分?(Y/N)”若选择“Y”,通过紧凑技术重新划分并分配,成功后,显示“分配成功!”若选择“N”,则输出“没有合适的剩余空间,不予分配。”
3.回收:输入回收进程的名字,若有相邻空闲分区,需要合并,并输出“回收成功!”;若输入错误,提示“查无此分区!” 4.显示:显示当前内存的分配状态。

0.退出

其他:输出“输入错误,请重新输入。”

输入格式:
先进行初始化后,按照菜单进行相应的操作。

输出格式:
菜单只显示一次,按照相应的选择输出。
输入样例1:
在这里给出一组输入。例如:

1
1024 5
4
0

结尾无空行
输出样例1:
在这里给出相应的输出。例如:

1.初始化
2.分配
3.回收
4.显示
0.退出
请选择:
分区号 分区 起始地址 结束地址 大小 当前状态
1 void 0 1023 1024 空闲
结尾无空行
输入样例2:
在这里给出一组输入。例如:1
1000 5
2
A 100
2
B 200
2
C 150
2
D 250
2
E 200
2
F 95
4
0

结尾无空行
输出样例2:
在这里给出相应的输出。例如:

1.初始化
2.分配
3.回收
4.显示
0.退出
请选择:
分配成功!
分配成功!
分配成功!
分配成功!
分配成功!
分配成功!
分区号 分区 起始地址 结束地址 大小 当前状态
1 A 0 99 100 已分配
2 B 100 299 200 已分配
3 C 300 449 150 已分配
4 D 450 699 250 已分配
5 E 700 899 200 已分配
6 F 900 999 100 已分配

结尾无空行
输入样例3:
在这里给出一组输入。例如:

1
1000 5
2
A 100
2
B 200
2
C 150
2
D 250
2
E 200
2
F 150
4
0
结尾无空行

输出样例3:
在这里给出相应的输出。例如:

1.初始化
2.分配
3.回收
4.显示
0.退出
请选择:
分配成功!
分配成功!
分配成功!
分配成功!
分配成功!
剩余空间不足,不予分配。
分区号 分区 起始地址 结束地址 大小 当前状态
1 A 0 99 100 已分配
2 B 100 299 200 已分配
3 C 300 449 150 已分配
4 D 450 699 250 已分配
5 E 700 899 200 已分配
6 void 900 999 100 空闲

结尾无空行
输入样例4:
在这里给出一组输入。例如:

1
1000 5
2
A 100
2
B 200
2
C 150
2
D 250
2
E 200
2
F 150
3
A
4
0

结尾无空行
输出样例4:
在这里给出相应的输出。例如:

1.初始化
2.分配
3.回收
4.显示
0.退出
请选择:
分配成功!
分配成功!
分配成功!
分配成功!
分配成功!
剩余空间不足,不予分配。
回收成功!
分区号 分区 起始地址 结束地址 大小 当前状态
1 void 0 99 100 空闲
2 B 100 299 200 已分配
3 C 300 449 150 已分配
4 D 450 699 250 已分配
5 E 700 899 200 已分配
6 void 900 999 100 空闲

结尾无空行
输入样例5:
在这里给出一组输入。例如:

1
1000 5
2
A 100
2
B 200
2
C 150
2
D 250
2
E 200
2
F 150
3
A
2
X 150
Y
4
0

结尾无空行
输出样例5:
在这里给出相应的输出。例如:

1.初始化
2.分配
3.回收
4.显示
0.退出
请选择:
分配成功!
分配成功!
分配成功!
分配成功!
分配成功!
剩余空间不足,不予分配。
回收成功!
是否通过紧凑技术,重新划分?(Y/N)
分配成功!
分区号 分区 起始地址 结束地址 大小 当前状态
1 B 0 199 200 已分配
2 C 200 349 150 已分配
3 D 350 599 250 已分配
4 E 600 799 200 已分配
5 X 800 949 150 已分配
6 void 950 999 50 空闲

二:思路

思路:
1.解释算法:动态分区分配-首次适应算法:
<1>:动态分区分配是根据进程的实际需要,动态的为之分配内存的空间,
<2>:那么首次适应算法首次适应算法,要求空闲分区链以地址递增的次序链接,
在分配内存时,从链首开始顺序查找,直到找到一个大小能满足要求的
空闲分区为止,然后再按照作业的大小,
从该分区中划出一块内存空间分给请求者,余下的空闲分区仍停留在空闲链中。
2.写码思路:先将整个框架写好,然后挨个写功能
3.选择数据结构:因为每组数据有多个,所以我们选择结构体数组

4.输入的要求
<1>.初始化:输入内存的大小和阈值minsize,初始状态下空闲分区名字为“void”。
<2>.分配:输入申请进程的名字、大小。

若可以分配,显示“分配成功!”;
若剩余空间不足,显示不分配原因“剩余空间不足,不予分配。”;
若剩余的空间通过紧凑技术,可以再分配,提示“是否通过紧凑技术,
重新划分?(Y/N)”若选择“Y”,通过紧凑技术重新划分并分配,成功后,
显示“分配成功!”若选择“N”,则输出“没有合适的剩余空间,不予分配。”
<3>.回收:输入回收进程的名字,若有相邻空闲分区,需要合并,并输出“回收成功!”;
若输入错误,提示“查无此分区!”
<4>.显示:显示当前内存的分配状态。
<0>.退出
其他:输出“输入错误,请重新输入。”

5.注意如果输入的进程没有占满内存,需要将剩下的内存也得输出来 并表示为空闲状态;

三:演示流程

在这里插入图片描述

四:debug(贴心杰的建议方式)

1:每实现一个功能就测试,不要等都写完了在去测试

2:整个码都码完了,那就挨个测试给出的示例,

3:如果上方还为未测试出你的bug,那么你就还是用给出的示例 但有一点,每当我们测试完一个用例后,不要退出,直接用功能 3 回收各个进程,然后再测试下一个用例

4:如果还没有,那就用PTA自带的测试用例,可以测你的格式是否正确,这道题最狗的还有是你输出的一定要跟样例一样,包括标点符号

五:上码(有些没用的注解 懒得删了 嘻嘻)


/**思路:1.解释算法:动态分区分配-首次适应算法:<1>:动态分区分配是根据进程的实际需要,动态的为之分配内存的空间,<2>:那么首次适应算法首次适应算法,要求空闲分区链以地址递增的次序链接,在分配内存时,从链首开始顺序查找,直到找到一个大小能满足要求的空闲分区为止,然后再按照作业的大小,从该分区中划出一块内存空间分给请求者,余下的空闲分区仍停留在空闲链中。2.写码思路:先将整个框架写好,然后挨个写功能3.选择数据结构:因为每组数据有多个,所以我们选择结构体数组4.输入的要求<1>.初始化:输入内存的大小和阈值minsize,初始状态下空闲分区名字为“void”。<2>.分配:输入申请进程的名字、大小。若可以分配,显示“分配成功!”;若剩余空间不足,显示不分配原因“剩余空间不足,不予分配。”;若剩余的空间通过紧凑技术,可以再分配,提示“是否通过紧凑技术,重新划分?(Y/N)”若选择“Y”,通过紧凑技术重新划分并分配,成功后,显示“分配成功!”若选择“N”,则输出“没有合适的剩余空间,不予分配。”<3>.回收:输入回收进程的名字,若有相邻空闲分区,需要合并,并输出“回收成功!”;若输入错误,提示“查无此分区!” <4>.显示:显示当前内存的分配状态。<0>.退出其他:输出“输入错误,请重新输入。” 5.注意如果输入的进程没有占满内存,需要将剩下的内存也得输出来 并表示为空闲状态; **/ 
#include<bits/stdc++.h>
using namespace std;struct Node{int id;//id号 string partition = "void";//分区int start;//起始地址 int end; //结束地址int size;//大小 string state = "空闲";//当前的状态 
}node[1000];int cnt = 0;
int memory,minsize;//内存的大小和阙值 
int sumSize = 0;//记录累计的容量 //1.初始化
void Initialize(){cin >> memory >> minsize;node[cnt].id = 1;node[cnt].start = 0;node[cnt].end = memory - 1;node[cnt].size = memory;} //2.分配//分区号 分区 起始地址 结束地址 大小 当前状态			 
//1    void    0       1023    1024 空闲//分区号 分区 起始地址 结束地址 大小 当前状态
//1    A     0         99      100 已分配
//2    B    100       299      200 已分配
//3    C    300       449      150 已分配
void distribution(){string processName;int processSize;cin >> processName >> processSize;if(cnt == 0){//这里主要是处理首个进程的计算 node[cnt].end = -1;} int temp1 = memory - node[cnt].end - 1;//这里是求出容器距离上一次的结束地址 还剩的空间大小int temp2 = memory - sumSize;//这里是总的剩余内存的大小  //考虑阙值int temp3 = temp1 - processSize;if(temp3 <= minsize && temp3 >= 0){ //如果剩余的空间小于阙值,那么的话我们就将剩下的空间全给其进程 processSize = temp1;} if(temp1 >= processSize){cnt++;node[cnt].id = cnt;node[cnt].partition = processName;if(cnt == 1){node[cnt].start = 0;}else{node[cnt].start = node[cnt-1].start + node[cnt-1].size;//本次的开始地址等于上次的开始地址加其大小 	}node[cnt].end = node[cnt].start + processSize - 1;//本次的结束地址为开始地址+其大小减一  node[cnt].size = processSize;node[cnt].state = "已分配"; sumSize += processSize;	   cout << "分配成功!" << endl; }else if(temp2 >= processSize){//如果第一个条件不满足,那么的话就判断剩余的总内存,也就是紧凑 cout << "是否通过紧凑技术,重新划分?(Y/N)" << endl;char ch;cin >> ch;/*如果我们的第一个if条件已经满足的话根本就不用考虑是否紧凑,那么好,如果我们要紧凑的话,只能说明在这个容器的前面还有空间,那么容器的前面有空间就说明发生了回收这时候如果我们选择 Y 那么的话我们就要更新前面的id....,如果是 N,那就不用更新  */ if(ch == 'Y'){//更新前面的空闲区,将非空的进程赋值给前面空的进程,紧凑出空间给新的进程	 	for(int i = 1; i <= cnt; i++) {	 	if(node[i].partition == "void"){int value =  node[i].size;//记录下来空闲区的大小 int j = i;bool temp = false; for( ; j < cnt; j++){node[j].id = j; node[j].partition = node[j+1].partition;node[j].start = node[j+1].start - value;node[j].end = node[j+1].end - value;node[j].size = node[j+1].size;node[j].state = node[j+1].state;temp = true;		} cnt--;//这时候腾出一个空间,所以结构体数组的大小减一	i = 0;//再从头开始遍历空闲区,因为空闲区可能不止一个			 	if(temp == false)//说明要紧凑的空间是最后一个,那么直接跳出循环 break;} } //这时候考虑我们的阙值 因为当没有紧凑的时候根本没有空间来判断剩余空间的大小//跟阙值的关系int laterTemp1 = memory - node[cnt].end - 1;//紧凑后的空间大小int laterTemp3 = laterTemp1 - processSize;if(laterTemp3 <= minsize){processSize = laterTemp1;} 			//赋值,当上方完成后这时候就腾出一个大的size 		     cnt++;			node[cnt].id = cnt;node[cnt].partition = processName;if(cnt == 1){node[cnt].start = 0;}else{node[cnt].start = node[cnt-1].start + node[cnt-1].size;//本次的开始地址等于上次的开始地址加其大小 	}node[cnt].end = node[cnt].start + processSize - 1;node[cnt].size = processSize;node[cnt].state = "已分配";sumSize += processSize; cout << "分配成功!" << endl;}else if (ch == 'N'){cout << "没有合适的剩余空间,不予分配。" << endl;}  }else{cout << "剩余空间不足,不予分配。" << endl; 	}	 	 
} //3.回收
void recycling(){
/*如果发生回收的话,要将 分区改为 void,其状态为空闲,其他均不变;分为四种情况:<1>:如果其上下均无空闲区,那么该回收的进程就单独成一行<2>:如果该回收的进程上放有一个空的空闲区,那么就要和其上方进行合并,修改上方的结束地址和空间大小<3>:如果该回收的进程的下方有一个空闲区,那么就修改回收进程的大小和结束地址即可<4>:如果该回收的进程上下都有空闲区,那么的话我们就修改最上方的空闲区的大小和结束地址即可 */ string processName;int flag = 0;	cin >> processName;for(int i = 1; i <= cnt; i++) {if(processName == node[i].partition){node[i].partition = "void";node[i].state = "空闲"; sumSize -= node[i].size;//一旦发生回收那么这个累计的容量就要减去回收的容量 flag = 1;break;}} if(flag == 1){cout << "回收成功!" << endl;/*这里我们在合并空闲区的时候只需要当发现一个空闲区的时候,看看下一个分区是否是空闲区如果是就合并 */for(int i = 1; i < cnt; i++){if(node[i].partition == "void" && node[i+1].partition == "void"){node[i].size += node[i+1].size;//其大小为两个分区的和 node[i].end = node[i+1].end;//其结束地址为下一个空闲区的结束地址//因为分区少了一个所以要更新后面分区的id号int j = i+2;for( ; j <= cnt; j++){node[j-1].id = j - 1; node[j-1].partition = node[j].partition;node[j-1].start = node[j].start;node[j-1].end = node[j].end;node[j-1].size = node[j].size;node[j-1].state = node[j].state;					   } cnt--;//分区少一个 i = 0;//再从头开始遍历 因为可能有多个空闲区 				}				 }	}else{cout << "查无此分区!" << endl;} 
} //4.显示
void show(){cout << "分区号 分区 起始地址 结束地址 大小 当前状态" << endl;if (cnt == 0) {for(int i = 0; i <= cnt; i++){cout << node[i].id << ' ' << node[i].partition << ' ' << node[i].start << ' ' << node[i].end << ' '<< node[i].size << ' '<< node[i].state;} } else {//这里需要将剩余的空间也得输出一下int remainTemp = memory - node[cnt].end - 1;   //这里写大于0 是因为上方我已经处理 minsize; if(remainTemp > 0){cnt++;node[cnt].id = cnt;node[cnt].partition = "void";if(cnt == 1){node[cnt].start = 0;}else{node[cnt].start = node[cnt-1].start + node[cnt-1].size;//本次的开始地址等于上次的开始地址加其大小 	} node[cnt].end = node[cnt].start + remainTemp - 1;node[cnt].size = remainTemp;node[cnt].state = "空闲"; }for(int i = 1; i <= cnt; i++){ cout << node[i].id << ' ' << node[i].partition << ' ' << node[i].start << ' ' << node[i].end << ' '<< node[i].size << ' '<< node[i].state << endl;		}    		}
} //菜单栏 
void menu(){cout <<	"1.初始化" << endl; cout << "2.分配" << endl;cout << "3.回收" << endl;cout << "4.显示" << endl; cout << "0.退出" << endl;cout << "请选择:" << endl; 
} int main(){bool flag = true;menu();while(flag){int option;cin >> option;switch(option){case 1: Initialize();break;case 2: distribution();break;case 3: recycling();break;case 4:	show();break;case 0 : flag = false;break;		default: cout << "输入错误,请重新输入。" << endl;							}		}	
}//测试分配区 
//分区号 分区 起始地址 结束地址 大小 当前状态
//1      A     0       99      100 已分配
//2      B     100     299     200 已分配
//3      C     300     449     150 已分配
//4      D     450     699     250 已分配
//5      E     700     899     200 已分配
//6      F     900     999     100 已分配//回收A之后 //分区号 分区 起始地址 结束地址 大小 当前状态
//1      B     0       199     200 已分配
//2      C     200     349     150 已分配
//3      D     350     599     250 已分配
//4      E     600     799     200 已分配
//5      X     800     949     150 已分配
//6      void  950     999      50 空闲//测试回收区 
//回收 A 和 B 
//分区号 分区 起始地址 结束地址 大小 当前状态
//1      void    0       99      100 空闲
//2      void    100     299     200 空闲
//3      C     300     449     150 已分配
//4      D     450     699     250 已分配
//5      E     700     899     200 已分配
//6      F     900     999     100 已分配//测试分配区//A 300
//B 200
//C 200
//
//回收 A
//
//D 500 

在这里插入图片描述

宝!!我让你把你不喜欢的博主取关了,你咋还把我给取关了呢!! 赶紧嘚,给我关注回来,我天天给你写博客看!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在生产环境下用好EFCore

原文链接&#xff1a;https://www.thereformedprogrammer.net/handling-entity-framework-core-database-migrations-in-production-part-2/作者&#xff1a;Jon P Smith在生产中运用EFCore的模式实战这是使用EF Core迁移数据库的系列文章中的第二篇。本文着眼于将迁移应用于数…

39. 组合总和020(思路+详解)

一&#xff1a;题目&#xff1a; 给定一个无重复元素的正整数数组 candidates 和一个正整数 target &#xff0c;找出 candidates 中所有可以使数字和为目标数 target 的唯一组合。 candidates 中的数字可以无限制重复被选取。如果至少一个所选数字数量不同&#xff0c;则两种…

8种方法解决vue创建项目报错:command failed: npm install --loglevel error

8种方法解决vue项目创建失败问题1、重建项目2、清除缓存3、重装淘宝源4、修改useTaobaoRegistry5、重装node6、删除npmrc文件7、 node版本问题8、css编辑工具选择9、管理员身份运行踩了这个巨大的坑&#xff01;&#xff01; 试了一个晚上终于找到了创建项目成功了T_T 当报错了…

40. 组合总和 II021(回溯法)

一&#xff1a;题目 给定一个数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 注意&#xff1a;解集不能包含重复的组合。 示例 1:输入: candidates [10,1,2,…

.NET Core + Kubernetes:Helm

Helm[1] 作为 Kubernetes 体系的包管理工具&#xff0c;已经逐渐成为了应用分发标准&#xff0c;在 .NET 开发中&#xff0c;可以理解为与 NuGet 包类似。回顾之前文章中的介绍&#xff0c;Kubernetes 中单个服务的部署有时会涉及到多种资源类型&#xff0c;如&#xff1a;Depl…

vue项目中引入阿里图标iconfont

vue如何在创建好的项目中引入阿里图标iconfont呢&#xff0c;涉及到以下几个步骤&#xff1a; 1、首先先到阿里图标官方网站https://www.iconfont.cn/&#xff0c;先对账户进行登录&#xff0c;登录完成后任意选择几个图标加入购物车 2、加入购物车后&#xff0c;点击页面最右…

78. 子集022(回溯法)

一&#xff1a;题目 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;…

vue项目中使用vue-router进行路由配置及嵌套多级路由

在vue项目中&#xff0c;很多时候我们需要二级路由或者三级路由来跳转页面&#xff0c;但大部分需求下我们都只用到了二级路由&#xff0c;有小伙伴就会发现&#xff0c;用到三级路由的时候&#xff0c;就会突然不知所措&#xff0c;是有新的方法呢&#xff0c;还是跟二级路由配…

解决流氓软件方法(亲测有效)

一:问题描述 本来我想在百度上下载一个API文档&#xff0c;我当然知道是取官网上下载了&#xff0c;但是我想要的是中文版&#xff0c;所以我就搜啊搜&#xff0c;搜到脚本之家 &#xff0c;那里面可以下载&#xff0c;我记得以前在里面下载过东西&#xff0c;以为安全就去下载…

.NET Core:跨平台和开源,让我在框架中脱颖而出

自从 2016 年微软发布了 .NET Core 1.0&#xff0c;至今 4 年的时间里&#xff0c;.NET Core 历经 7 个正式版本和几十个 Preview 版本。.NET Core 作为最通用的框架&#xff0c;和其他软件框架不同的是&#xff0c;它面向 Windows、Linux 和 MacOS 多个平台&#xff0c;在桌面…

vue实现侧边折叠菜单栏手风琴效果

在我们做管理后台亦或是产品流程时&#xff0c;总是需要一个菜单栏或者导航栏来架起我们的产品架构&#xff0c;那么&#xff0c;如何用vue实现侧边折叠导航栏呢&#xff1f;接下来将一一介绍。 请先看效果演示图。 步骤1&#xff1a;先架构整个页面的布局&#xff0c;撰写html…

程序员过关斩将--解决分布式session问题

微信搜一搜架构师修行之路session 说到 session&#xff0c;我相信每个程序员都不陌生&#xff0c;或多或少在项目中使用过。session 这个词&#xff0c;其实是一个抽象的概念&#xff0c;它不像 Cookie 那样有着明确的定义。当大多数程序员谈论 session 的时候&#xff0c;可能…

如何将nodejs项目程序部署到阿里云服务器上

将nodejs项目程序部署到阿里云服务器上一、概述二、具体步骤1、拥有自己的服务器2、下载Xshell3、 oneinstack配置web环境4、 XShell连接远程主机5、更新系统软件6、在服务器上安装node环境7、部署项目到服务器上8、安装pm2并启动nodejs项目三、快捷指令1、linux的常用命令2、p…

101. 对称二叉树023(BFS)

一&#xff1a;题目 二&#xff1a;上码 /*** 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(nullpt…

中移动完成透镜天线远距覆盖和降本增效试点

日前&#xff0c;中国移动研究院在官微上正式发布了《新型透镜天线进行首次高铁覆盖实验》一文。中国移动研究院、中国移动甘肃公司与西安海天天线科技股份有限公司联合开展的人工介质圆柱透镜天线在高铁、高速等线状纵深领域的长距覆盖取得突破性进展。两年以来&#xff0c;铁…

基于PHPEnv的本地环境搭建—PHP第一个项目:HelloWorld(从安装到运行)

1、安装软件 编程工具&#xff1a;Notepad 运行环境&#xff1a;phpEnv 2、用phpEnv建立本地运行环境 &#xff08;1&#xff09;官方下载phpEnv&#xff0c;运行phpEnv&#xff0c;启动服务。服务启动之后&#xff0c;apache和mysql变绿。如下图所示&#xff1a; &#xff0…

在idae中为什么用Module创建一个新的Maven项目的时候会被卡死

一:问题描述 然后就会卡死&#xff0c; 二&#xff1a;问题解决 我们会发现这里的路径是有问题的&#xff0c;idea自带的maven会卡死我们&#xff0c;因为下载jar包的速度慢的惊人 将其改为我们自己maven路径&#xff0c;下载速度会很快&#xff0c;便不会出现卡死的现象&a…

ASP.NET Core Blazor Webassembly 之 数据绑定

上一次我们学习了Blazor组件相关的知识&#xff08;Asp.net Core Blazor Webassembly - 组件&#xff09;。这次继续学习Blazor的数据绑定相关的知识。当代前端框架都离不开数据绑定技术。数据绑定技术以数据为主导来驱动UI界面&#xff0c;用户对数据的修改会实时提现在UI上&a…

PHP做二次开发:本机安装ThinkCMF系统

使用工具&#xff1a;phpEnv、TortoiseGit 具体步骤&#xff1a; 1.获取thinkcmf源代码 2.修改Hosts文件设置虚拟域名指向本机 3.配置apache建立本地站点 4.建立数据库 5.访问本地站点开始安装 第一步&#xff1a;获取thinkcmf源代码 1.打开浏览器访问gitee.com&#xff0c;搜…

107. 二叉树的层序遍历 II and 102. 二叉树的层序遍历 023(BFS模板题打两道)

一&#xff1a;题目 二&#xff1a;上码 /*** 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(nullpt…