之前在网上找图的深度优先广度优先的非递归算法,前几个都是以邻接矩阵形式存储的图。所以自己就当练练手,写了以邻接表形式存储的图的两种遍历
两种遍历关键是对于已遍历的元素的存储。
深度优先利用了栈先进后出的特性,而广度优先利用了队列先进先出的特性
写得不好,请多多指教
void DFS(){//邻接表存储图的非递归深度优先
ArcNode *p;
stack<int> s;
cout << 0 << endl;//默认从0结点开始遍历
visited[0] = 1;//此为遍历标志数组,0:未访问,1:已访问
s.push(0);
while (!s.empty()){
p = V[s.top()].firstedge;
while (p != NULL){
if (visited[p->adjvex] != 1){
cout << p->adjvex << endl;
visited[p->adjvex] = 1;
s.push(p->adjvex);
break;
}else{
p = p->next;
}
}
if (p == NULL){
s.pop();
}
}
}
void BFS(){//邻接表存储图的非递归广度优先
ArcNode *p;
queue<int> q;
cout << 0 << endl;//默认从0结点开始遍历
visited[0] = 1;//此为遍历标志数组,0:未访问,1:已访问
q.push(0);
while (!q.empty()){
p = V[q.front()].firstedge;
q.pop();
while (p != NULL){
if (visited[p->adjvex] != 1){
cout << p->adjvex << endl;
visited[p->adjvex] = 1;
q.push(p->adjvex);
}
p = p->next;
}
}
}