算法题——图的深度优先遍历
原理和方法可以参考: 图的深度优先遍历
教科书上的C代码,递归:
1 //教科书方法,邻接表
2 bool visited[MAX];
3 void visitFunc(int v);
4
5 void dfsTraverse(Graph G)
6 {
7 for(v = 0; v < G.vexnum; ++v) //初始化访问标识为false
8 visited[v] = false;
9 for(v = 0; v < G.vexnum; ++v) //深搜
10 if(!visited[v])
11 dfs(G, v);
12 }
13
14 void dfs(Graph G, int v)
15 {
16 visited[v] = true;
17 visitFunc(v);
18 for(w = firstAdjVex(G, v); w; w = nextAdjVex(G, v, w)) //遍历邻接表
19 if(!visited[w])
20 dfs(G, w);
21 }
迭代版:
1 //使用堆栈来保持顺序,迭代
2 void dfsTraverse(GraphNode *G)
3 {
4 unordered_map<GraphNode *, bool> visited;
5 stack<GraphNode*> unvisited;
6 unvisited.push(G); //第一个结点入栈
7 while( !unvisited.empty() )
8 {
9 cur = unvisited.top();
10 unvisited.pop();
11
12 for(w = G.neighbor; w != NULL; w = w->next) //遍历邻接表
13 if( visited.find(w->Node) == visited.end() )
14 {
15 unvisited.push(w->Node);
16 visited[w->Node] = true;
17 }
18
19 visitFunc(cur);
20 }
21 }