c++实现树的广度搜索和深度搜索完…
2012-12-27 11:27
218 查看
#include <iostream>
#include <queue>
using namespace std;
struct Node { //定义表结点
int adjvex; //该边所指向的顶点的位置
Node *next; //下一条边的指针
};
struct HeadNode{ // 定义头结点
int nodeName; //
顶点信息
bool visited;
//表示该结点是否被访问过
Node *link;
//指向第一条依附该顶点的边的指针
};
//添加从begin-1 -> end-1的弧
void addVertex(HeadNode *G, int begin, int end) {
// 创建新的结点插入链接表
Node *node = new Node;
node->adjvex = end -
1;
//插入链接表的第一个位置
node->next =
G[begin-1].link;
G[begin-1].link = node;
}
//G表示指向头结点数组的第一个结点的指针
//nodeNum表示结点个数
//arcNum表示边的个数
void createGraph(HeadNode *G, int nodeNum, int arcNum) {
cout <<
"开始创建图(" << nodeNum
<< ", "
<< arcNum
<< ")"
<< endl;
//初始化头结点
for (int i = 0; i < nodeNum;
i++) {
G[i].nodeName = i+1;
//位置0上面存储的是结点v1,依次类推
G[i].link = NULL;
}
for (int j = 0; j < arcNum;
j++) {
int v1, v2;
cout
<< "请依次输入 边1 边2: ";
cin
>> v1
>> v2;
addVertex(G, v1,
v2);
addVertex(G, v2,
v1);
}
}
//从标号start-1的结点开始深度搜索: 递归实现
void DFS(HeadNode *G, int start) {
G[start-1].visited = true;
Node *node = G[start-1].link;
cout << "v"
<< start
<< " ";
while (node) {
if
(!G[node->adjvex].visited) {
DFS(G, node->adjvex + 1);
}
node =
node->next;
}
}
//从标号start-1的结点开始广度搜索: 非递归实现
void BFS(HeadNode *G, int start) {
queue q;
q.push(start);
while (!q.empty()) {
int current = q.front();
q.pop();
cout
<< "v"
<< current
<< " ";
G[current-1].visited =
true;
Node *node =
G[current-1].link;
while (node
&&
!G[node->adjvex].visited) {
q.push(node->adjvex + 1);
node
= node -> next;
}
}
}
// 初始化结点
void initVisted(HeadNode *G, int nodeNum) {
for (int i = 0; i < nodeNum;
++i) {
G[i].visited =
false;
}
}
int main() {
HeadNode *G;
int nodeNum, arcNum;
cout <<
"请输入顶点个数,边长个数: ";
cin >>
nodeNum >> arcNum;
G = new HeadNode[nodeNum];
createGraph(G, nodeNum, arcNum);
//深度搜索算法
initVisted(G, nodeNum);
cout <<
"深度搜索遍历序列为: ";
DFS(G, 1);
cout <<
endl;
//广度搜索算法
initVisted(G, nodeNum);
cout <<
"广度搜索遍历序列为: ";
BFS(G, 1);
cout <<
endl;
return 1;
}
#include <queue>
using namespace std;
struct Node { //定义表结点
int adjvex; //该边所指向的顶点的位置
Node *next; //下一条边的指针
};
struct HeadNode{ // 定义头结点
int nodeName; //
顶点信息
bool visited;
//表示该结点是否被访问过
Node *link;
//指向第一条依附该顶点的边的指针
};
//添加从begin-1 -> end-1的弧
void addVertex(HeadNode *G, int begin, int end) {
// 创建新的结点插入链接表
Node *node = new Node;
node->adjvex = end -
1;
//插入链接表的第一个位置
node->next =
G[begin-1].link;
G[begin-1].link = node;
}
//G表示指向头结点数组的第一个结点的指针
//nodeNum表示结点个数
//arcNum表示边的个数
void createGraph(HeadNode *G, int nodeNum, int arcNum) {
cout <<
"开始创建图(" << nodeNum
<< ", "
<< arcNum
<< ")"
<< endl;
//初始化头结点
for (int i = 0; i < nodeNum;
i++) {
G[i].nodeName = i+1;
//位置0上面存储的是结点v1,依次类推
G[i].link = NULL;
}
for (int j = 0; j < arcNum;
j++) {
int v1, v2;
cout
<< "请依次输入 边1 边2: ";
cin
>> v1
>> v2;
addVertex(G, v1,
v2);
addVertex(G, v2,
v1);
}
}
//从标号start-1的结点开始深度搜索: 递归实现
void DFS(HeadNode *G, int start) {
G[start-1].visited = true;
Node *node = G[start-1].link;
cout << "v"
<< start
<< " ";
while (node) {
if
(!G[node->adjvex].visited) {
DFS(G, node->adjvex + 1);
}
node =
node->next;
}
}
//从标号start-1的结点开始广度搜索: 非递归实现
void BFS(HeadNode *G, int start) {
queue q;
q.push(start);
while (!q.empty()) {
int current = q.front();
q.pop();
cout
<< "v"
<< current
<< " ";
G[current-1].visited =
true;
Node *node =
G[current-1].link;
while (node
&&
!G[node->adjvex].visited) {
q.push(node->adjvex + 1);
node
= node -> next;
}
}
}
// 初始化结点
void initVisted(HeadNode *G, int nodeNum) {
for (int i = 0; i < nodeNum;
++i) {
G[i].visited =
false;
}
}
int main() {
HeadNode *G;
int nodeNum, arcNum;
cout <<
"请输入顶点个数,边长个数: ";
cin >>
nodeNum >> arcNum;
G = new HeadNode[nodeNum];
createGraph(G, nodeNum, arcNum);
//深度搜索算法
initVisted(G, nodeNum);
cout <<
"深度搜索遍历序列为: ";
DFS(G, 1);
cout <<
endl;
//广度搜索算法
initVisted(G, nodeNum);
cout <<
"广度搜索遍历序列为: ";
BFS(G, 1);
cout <<
endl;
return 1;
}
相关文章推荐
- 基于C++ STL图的邻接表表示及深度、广度搜索实现
- c++实现树的广度搜索和深度搜索完整代码
- C++ 图的深度搜索广度搜索和最小生成树代码实现
- C++实现广度优先搜索实例
- C++实现图的广度优先遍历与深度优先遍历
- c++实现广度优先和深度优先查找目录结构
- 图的存储及遍历 深度遍历和广度遍历 C++代码实现
- 用邻接表实现深度和广度搜索
- 普通树的广度搜索和深度搜索java实现
- 深度优先搜索和广度优先搜索的代码实现
- 无权图无向图【邻接矩阵存储】深度搜索和广度搜索--Java实现
- C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
- 广度优先搜索与深度优先搜索的 java 实现
- 迷宫问题解决方法:分别基于深度搜索和广度搜索的思想来实现
- JAVA实现广度搜索&深度搜素
- 图的深度优先(非递归)、广度优先、最小生成树的C++实现
- 迷宫问题解决方法:分别基于深度搜索和广度搜索的思想来实现
- 图的深度优先和广度优先遍历(图以邻接表表示,由C++面向对象实现)
- 有向图深度优先与广度优先算法的C++实现
- C++深度优先搜索的实现方法