深度优先遍历(DFS)
动图
伪代码
递归
visited[0...V-1] = false;
for (int v = 0; v < G.V(); v++)
if (!visited[v]) {
dfs(v);
}
dfs(int v) {
visited[v] = true;
for (int w : G.adj(v))
if (!visited[w])
dfs(w);
}
非递归
visited[0...V-1] = false;
for (int v = 0; v < G.V(); v++)
if (!visited[v]) {
dfs(v);
}
dfs(int s) {
stack.add(s);
visited[s] = true;
whilie (stack.isEmpty()) {
int v = stack.remove();
for (int w : G.adj(v))
if (!visited[w]) {
stack.add(w);
visited[w] = true;
}
}
}
}
dfs非递归分析动图(栈)
广度优先遍历(BFS)
动图
伪代码
visited[0...V-1] = false;
for (int v = 0; v < G.V(); v++)
if (!visited[v]) {
dfs(v);
}
dfs(int s) {
queue.add(s);
visited[s] = true;
whilie (queue.isEmpty()) {
int v = queue.remove();
for (int w : G.adj(v))
if (!visited[w]) {
queue.add(w);
visited[w] = true;
}
}
}
}
bfs分析动图(队列)
深度优先遍历和广度优先内在联系(遍历代码比较)
如下图,可以看出广度优先遍历和深度优先遍历在代码上基本是一致的,只是使用的数据结构不同