一.深度优先
深度优先遍历是一个递归的过程
i从顶点v出发进行深度优先遍历的基本思想是:
(1)访问顶点v
( 2)从v的未被访问的邻接点中选取一个顶点w,从w出发进行深度优先遍历
(3)重复上述两步,直至访问所有和v有路径相通的顶点
伪代码:
算法 :DFTraverse
I输入:顶点的编号v
输出:无
1. 访问顶点v;修改标志visited[v]= 1;
2. w =顶点v的第一个邻接点;
3. while (w存在)
3.1 if(w未被访问)从顶点w出发递归执行该算法;3.2 w =顶点v的下一个邻接点;
template
void MGraph :: DFTraverse(int v)
{
cout << vertex[v]; visited[v] = 1;
for (int j = 0; j < vertexNum; j++)
if (edge[v][j] == 1 && visited[j] == 0)
DFTraverse( j );
}
二.广度优先
"先被访问顶点的邻接点"先于“后被访问顶点的邻接点”
i从顶点v出发进行广度优先遍历的基本思想是:
(1)访问顶点v
(2)依次访问v的各个未被访问的邻接点V/2......
(3)分别从V, 2, ... Vk出发依次访问它们未被访问的邻接点,| 直至访问所有与顶点v有路径相通的顶点
伪代码
算法 :BFTraverse
输入 :顶点的编号 v
输出:无
1.队列Q初始化;
2.访问顶点v;修改标志visited [v]= 1;顶点v入队列Q;
3. while (队列Q非空)
3.1 v=队列Q的队头元素出队;
3.2w=顶点v的第一个邻接点;
3.3 while (w存在)
3.3.1 如果w未被访问,则
访问顶点w ;修改标志visited[w]= 1;顶点w入队列Q ;3.3.2w=顶点v的下一个邻接点;
template
void MGraph :: BFTraverse(int v)
{
int w, j, Q[MaxSize]; //采用顺序队列
int front = -1, rear = -1; //初始化队列
cout << vertex[v]; visited[v] = 1; Q[++rear] = v; //被访问顶点入队
while (front != rear) //当队列非空时
{
w = Q[++front]; //将队头元素出队并送到v中
for (j = 0; j < vertexNum; j++)
if (edge[w][j] == 1 && visited[j] == 0 )
{
cout << vertex[j];
visited[j] = 1; Q[++rear] = j;
}
}
}