1. 基本概念
如图所示,BFS为是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。想象一个满二叉树(3层有序),A 是第一个访问的,然后顺序是 B、C,然后再是 D、E、F、G。
2. 基本思路
仔细看看层序遍历过程,其实就是从上到下,从左到右依次将每个数放入到队列中,然后按顺序依次打印就是想要的结果。所以这里我们借助一个队列进行操作。
二叉树BFS考题1,2
二叉树BFS1
题目描述
输入一串二叉树,对其从根结点开始进行 BFS,输出 BFS 序。
输入格式
第一行为二叉树的结点数 (n ≤ 10001000);
之后 n 行,每行包含 33 个整数,分别为当前结点序号,以及其左右儿子序号,空格隔开。
( −1 表示空结点)
保证:
-
1.这 n 行数据依次对应第 11 个点至第 n 个点;
-
2.第 11 个点为二叉树的根结点。
输出格式
一行,BFS序,用一个空格隔开。
样例 #1
样例输入 #1
5
1 2 3
2 4 5
3 -1 -1
4 -1 -1
5 -1 -1
样例输出 #1
1 2 3 4 5
#include<iostream>
#include<queue>
#include<string>
using namespace std;
struct node{
int d,l,r;
}t[1005];
void bfs(int id){
queue<int> q;
q.push(id);
while(!q.empty()){
int tmp=q.front();
q.pop();
cout<<tmp<<" ";
if(t[tmp].l!=-1){
q.push(t[tmp].l);
}
if(t[tmp].r!=-1){
q.push(t[tmp].r);
}
}
}
int main(){
int n,a,b,c;
cin>>n;
for(int i=1;i<=n;i++){
cin>>t[i].d>>t[i].l>>t[i].r;
}
bfs(1);
return 0;
}
/*
编译结果...
--------
- 错误: 0
- 警告: 0
- 输出文件名: C:\Users\Administrator\Documents\f.exe
- 输出大小: 1.83254718780518 MiB
- 编译时间: 1.89s
*/
二叉树BFS2
题目描述
输入一串二叉树,对其从根结点开始进行 BFS
,输出:
BFS
序;- 从根结点出发到每个结点的最短路长度。
输入格式
第一行为二叉树的结点数( n≤1000)n(n≤1000)。
之后 n 行,每行包含 33 个整数,分别为当前结点序号,以及其左右儿子序号,空格隔开。(−1−1 表示空结点)
保证:
- 这 n 行数据依次对应第 11 个点至第 n 个点;
- 第 11 个点为二叉树的根结点。
输出格式
两行,第一行为 BFS
序,第二行从根结点出发至每个结点的最短路长度,均用一个空格隔开。
样例 #1
样例输入 #1
5
1 2 3
2 4 5
3 -1 -1
4 -1 -1
5 -1 -1
样例输出 #1
1 2 3 4 5
0 1 1 2 2
提示
样例如下图:
从根结点至根结点的路径长度为 0 。
#include<iostream>
#include<queue>
#include<string>
using namespace std;
struct node{
int d,l,r;
}t[1005];
int dis[1005];
void bfs(int id){
queue<int> q;
q.push(id);
dis[id]=0;
while(!q.empty()){
int tmp=q.front();
q.pop();
cout<<tmp<<" ";
if(t[tmp].l!=-1){
dis[t[tmp].l]=dis[tmp]+1;
q.push(t[tmp].l);
}
if(t[tmp].r!=-1){
dis[t[tmp].r]=dis[tmp]+1;
q.push(t[tmp].r);
}
}
}
int main(){
int n,a,b,c;
cin>>n;
for(int i=1;i<=n;i++){
cin>>t[i].d>>t[i].l>>t[i].r;
}
bfs(1);
cout<<endl;
for(int i=1;i<=n;i++){
cout<<dis[i]<<" ";
}
return 0;
}
/*
编译结果...
--------
- 错误: 0
- 警告: 0
- 输出文件名: C:\Users\Administrator\Documents\y.exe
- 输出大小: 1.86571598052979 MiB
- 编译时间: 2.02s
*/
以上两题考察的是二叉树的BFS遍历,
第1题难度 1星 ,第2题难度 2星