图的广度优先/层次 遍历(BFS) c++ 队列实现

  在之前的博文中,介绍了图的深度优先遍历,并分别进行了递归和非递归实现。BFS 无法递归实现,最广泛的实现是利用队列(queue)。这与DFS的栈实现是极其相似的,甚至代码几乎都很少需要改动。从给定的起点节点开始,依次将其邻接节点全部塞入队列,每次访问一个节点时将其pop()出队列,并将其邻接节点也塞入队列。直到队列为空,算法结束。

  代码实现并无太大障碍,c++实现:

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4
 5 #define MAX 20
 6 #define START 1
 7
 8 int visited[MAX];
 9 int map[MAX][MAX];
10
11 void bfs(int start, int n){
12     queue<int> q;
13     int q_top;
14     cout<<start<<" ";
15     visited[start] = 1;
16     for (int i = 1; i <= n ;i++ ) {
17         if(map[start][i] == 1 && visited[i] == 0){
18             q.push(i);
19             visited[i] = 1;
20         }
21     }
22     while(!q.empty()){
23         q_top = q.front();
24         q.pop();
25         cout<<q_top<<" ";
26         for(int i = 1; i <= n; i++ ){
27             if(map[q_top][i] == 1 && visited[i] == 0){
28                 q.push(i);
29                 visited[i] = 1;
30             }
31         }
32     }
33
34 }
35
36 int main(int argc, const char * argv[]) {
37     int num_vex,num_edge,x,y;
38     cout<<"Input number of nodes and edges >> ";
39     cin>>num_vex>>num_edge;
40     for(int i=0;i<MAX;i++){
41         for(int j = 0;j < MAX;j++){
42             map[i][j] = 0;
43         }
44     }
45     for(int i = 1;i <= num_vex;i++){
46         visited[i] = 0;
47     }
48     cout<<"Input edges, "<<num_edge<<" left >> ";
49     for(int i = 1;i <= num_edge;i++){
50         cin>>x>>y;
51         map[x][y] = map[y][x] = 1;
52         cout<<"Input edges, "<<(num_edge-i)<<" left >> ";
53     }
54     bfs(START, num_vex);
55     return 0;
56 }
时间: 2024-10-12 21:13:08

图的广度优先/层次 遍历(BFS) c++ 队列实现的相关文章

图的创建和遍历(BFS/DFS)

图的表示方法主要有邻接矩阵和邻接表.其中邻接表最为常用,因此这里便以邻接表为例介绍一下图的创建及遍历方法. 创建图用到的结构有两种:顶点及弧 struct ArcNode { int vertexIndex; //该弧指向的顶点位置 struct ArcNode* next; //指向下一个弧 InfoType info; //该弧的相关信息,如权重等 }; struct Vertex { VertexType data; //顶点信息 ArcNode* firstArc; //指向第一条依附该

图的广度优先搜索(BFS)

把以前写过的图的广度优先搜索分享给大家(C语言版) 1 #include<stdio.h> 2 #include<stdlib.h> 3 #define MAX_VERTEX_NUM 20 4 #define MAXQSIZE 100 5 #define OK 1 6 typedef char VertexType; 7 typedef int QElemType; 8 9 typedef struct ArcNode//边结点 10 { 11 int adjvex; 12 str

二叉树的层次遍历(BFS)

今日在LeetCode平台上刷到一道Medium难度的题,要求是二叉树的层次遍历.个人认为难度并不应该定在Medium, 应该是Easy比较合适,因为并没有复杂的算法逻辑,也没有corner cases class Solution { public List<List<Integer>> levelOrder(TreeNode root) { //using queue List<List<Integer>> res= new ArrayList<&

二叉树遍历,深度有限遍历,广度优先遍历,前序中序后续优先遍历,层次遍历

首先明白两个概念: 1. 深度遍历包括前中后序遍历三种: 2. 广度优先遍历就是层次遍历. PS: 前中后序遍历,如果使用递归遍历,都很简单易理解: 如果使用非递归方式,首先想到的就应该是使用栈结构来控制整个过程,因为递归也是利用栈来实现的: 前中后序遍历的非递归方式中,后序遍历的非递归方式相比较而言,略复杂. 直接上代码: #include "stdlib.h" #include <iostream> #include <stack> #include <

【数据结构】图的广度优先搜索

图的广度优先搜索(BFS)与树的广度优先搜索类似.与树不同的是,图中可能存在循环.所我们可能会再次访问到同一个节点.为了表面多次处理同一个节点,我们要布尔变量数据记录节点有没有被访问过.为了简化,我们假设所有的节点都是从根节点可达的. 比如在下图中,我们从节点2出发.当我们访问到节点0时,我们寻找所有与他相邻的节点.节点2就是与0相邻的节点,如果我们不对已访问的节点做标记,那么节点2就会被重复访问.这样的话,算法将会一直进行下去.对下图进行广度优先搜索的结果是2,0,3,1. 以下C++程序是从

SDUTOJ 2173 数据结构实验之求二叉树后序遍历和层次遍历

#include<iostream> #include<stdio.h> #include<queue> #include<string.h> #include<stdlib.h> using namespace std; char s1[100],s2[100],ans[100]; typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTr

重建二叉树与二叉树的层次遍历

数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历. 输入 输入数据有多组,第一行是一个整数t (t<1000).代表有t组測试数据.每组包含两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列. 输出 每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列 演示样例输

非递归遍历二叉树【层次遍历,先序、中序、后序遍历】

一.层次遍历:借助队列实现 1 void LevelOrderTraversal(BiTree root) 2 { 3 BiTree e = root;//从根节点开始 4 Queue *q; 5 InitQueue(q); 6 7 if(e)//若根结点非空,则入队列 8 { 9 EnQueue(q,e); 10 } 11 12 while(!QueueEmpty(q)) 13 { 14 DelQueue(q,e); 15 Visit(e); 16 if(e->leftChild)//左孩子不

毕业了-java二叉树层次遍历算法

/*************************************** * 时间:2017年6月23日 * author:lcy * 内容:二叉树的层次遍历 * 需要借助队列这个数据结构,直接import就可以了 * 1.首先将根节点放入队列中. 2.当队列为非空时,循环执行步骤3到步骤5,否则执行6: 3.出队列取得一个结点,访问该结点: 4.若该结点的左子树为非空,则将该结点的左子树入队列: 5.若该结点的右子树为非空,则将该结点的右子树入队列: 6.结束. ***********