1.深度优先遍历
又称为深度优先搜索,简称为DFS。
2.邻接矩阵实现深度优先遍历的程序设计
#define MAX 100 //设置最大节点个数
bool visited[MAX]; //设置访问flag数组
void DFSTraverse(Graph G) //深度遍历
{
for (int i = 0; i < numVertexes; i++)
{
visited[i] = false; //初始化所有结点都未遍历
}
for (int i = 0; i < numVertexes; i++)
{
if (!visited[i]) //若是连通图只会执行一次
DFS(G, i);
}
}
void DFS(Graph G, int i)
{
visited[i] = true;
cout << G.vexs[i] << endl; //输出当前结点存储的值
for (int j = 0; j < numVertexes; j++)
{
if (G.arc[i][j] != INFINITY_l && visited[j] = false) //如果两点之间有路径并且另一点还没有遍历过
DFS(G, j); //继续往下递归
}
}
3.邻接表实现深度优先遍历的程序设计
#define MAX 100 //设置最大节点个数
bool visited[MAX]; //设置访问flag数组
void DFSTraverse(Graph G) //深度遍历
{
for (int i = 0; i < numVertexes; i++)
{
visited[i] = false; //初始化所有结点都未遍历
}
for (int i = 0; i < numVertexes; i++)
{
if (!visited[i]) //若是连通图只会执行一次
DFS(G, i);
}
}
void DFS(Graph G, int i)
{
EdgeNode *p;
visited[i] = true;
cout << G.adjList[i].data << endl; //输出当前结点存储的值
p = G.adjList[i].firstedge;
while(p != nullptr)
{
if(!visited[p->adjVex])
DFS(G,p->adjVex);
p = p->next;
}
}
4.广度优先遍历
广度优先遍历又称为广度优先搜索,简称BFS
5.邻接矩阵实现广度优先遍历的程序设计
void BFSTraverse(Graph G)
{
int i, j;
Queue Q; //定义一个队列Queue
InitQueue(&Q); //初始化队列
for (i; i < G.numVertexes; i++)
visited[i] = false; //初始化为未访问
for (i = 0; i < G.numVertexes; i++)
{
if (!visited[i]) //处理未访问的结点
{
visited[i] = true;
cout << G.vexs[i] << endl;
EnQueue(&Q, i);
while (!QueueEmpty(Q)) //队列不为空
{
DeQueue(&Q, &i); //出队列
for (j = 0; j < G.numVertexes; j++)
{
if (G.arc[i][j] == 1 && !visited[j]) //如果有路径且未访问
{
visited[j] = true;
cout << G.vex[j] << endl;
EnQueue(&Q, j);
}
}
}
}
}
}
6.邻接表实现广度优先遍历的程序设计
void BFSTraverse(Graph G)
{
int i;
EdgeNode *p;
Queue Q; //定义一个队列Queue
InitQueue(&Q); //初始化队列
for (i = 0; i < G.numVertexes; i++)
visited[i] = false; //初始化为未访问
for (i = 0; i < G.numVertexes; i++)
{
if (!visited[i]) //处理未访问的结点
{
visited[i] = true;
cout << G.adjList[i].data << endl;
EnQueue(&Q, i);
while (!QueueEmpty(Q)) //队列不为空
{
DeQueue(&Q, &i); //出队列
p = G->adjList[i].firstedge;
while(p != nullptr)
{
if (!visited[p->adjVex])
{
visited[p->adjVex] = true;
cout << G.adjList[p->adjVex].data << endl;
EnQueue(&Q, j);
}
p = p -> next;
}
}
}
}
}