C++使用递归和非递归方式实现BFS和DFS
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
int visitedDFS[5] = { 0 };
int visitedBFS[5] = { 0 };
int count_DFS = 0;
int count_dfs = 0;
int count_BFS = 0;
int count_bfs = 0;
void DFS(int startNum, int mat[][5]) {
stack<int> s;
s.push(startNum);
int flag[5] = { 0 };
flag[startNum - 1] = 1;
cout << startNum << " ";
while (!s.empty())
{
int currentNum = s.top();
int i;
for (i = 0; i < 5; i++) {
count_DFS++;
if (mat[currentNum - 1][i] == 1 && flag[i] == 0) {
s.push(i + 1);
flag[i] = 1;
cout << i+1 << " ";
break;
}
}
if (i == 5) s.pop();
}
return;
}
void dfs(int startNum, int mat[][5]) {
int i;
visitedDFS[startNum - 1] = 1;
cout << startNum << " ";
for (i = 0; i < 5; i++) {
count_dfs++;
if (visitedDFS[i] == 0 && mat[startNum - 1][i] == 1) dfs(i+1,mat);
}
}
void BFS(int startNum,int mat[][5]) {
queue<int> q;
q.push(startNum);
int flag[5] = { 0 };
if (flag[startNum - 1] == 0) {
flag[startNum - 1] = 1;
cout << startNum << " ";
}
while (!q.empty())
{
int currentNum = q.front();
q.pop();
for (int i = 0; i < 5; i++) {
count_BFS++;
if (mat[currentNum - 1][i] == 1 && flag[i] == 0) {
q.push(i+1);
flag[i] = 1;
cout << i+1 << " ";
}
}
}
return;
}
void bfs(int startNum, int mat[][5]) {
if (visitedBFS[startNum - 1] == 0) {
visitedBFS[startNum - 1] = 1;
cout << startNum << " ";
}
int i;
int flag = 0;
for (i = 0; i < 5; i++) {
count_bfs++;
if (visitedBFS[i] == 0 && mat[startNum - 1][i] == 1) {
cout << i+1 << " ";
visitedBFS[i] = 1;
flag = 1;
}
}
if (flag)
for (int j = 0; j < 5; j++) {
if (mat[startNum - 1][j] == 1) bfs(j+1,mat);
}
}
int main() {
int matrix[5][5] = {{0,1,0,1,1},
{1,0,1,1,0},
{0,1,0,1,0},
{1,1,1,0,0},
{1,0,0,0,0}};
cout << "设置输入矩阵如下:" << endl;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++)
cout << matrix[i][j] << " ";
cout << endl;
}
cout << "宽度优先遍历非递归实现:" << endl;
BFS(1, matrix);
cout << "循环次数:" << count_BFS << endl;
cout << "宽度优先遍历递归实现:" << endl;
bfs(1, matrix);
cout << "循环次数:" << count_bfs << endl;
cout << "深度优先遍历非递归实现:"<< endl;
DFS(1, matrix);
cout <<"循环次数:"<< count_DFS << endl;
cout << "深度优先遍历递归实现:"<< endl;
dfs(1, matrix);
cout << "循环次数:" << count_dfs << endl;
return 0;
}