0%
DFS 与 BFS 的思想
以遍历树为例
DFS
使用了栈思想
思路:
- 将根节点入栈
- 检查与栈顶元素相连的元素是否存在未被遍历(标记)过的元素,如果有则将其入栈,如果无则将堆顶元素弹出
- 重复第二步直到遍历结束
代码实现:
1 2 3 4 5 6 7 8 9 10
| int dfs(int u) { st[u] = true;
for (int i = h[u]; i != -1; i = ne[i]) { int j = e[i]; if (!st[j]) dfs(j); } }
|
BFS
使用了队列的实现方式
思路:
- 将根节点入队
- 弹出队头并将与队头节点相连的未遍历过的节点依次入队
- 重复第二步直到遍历结束(队列为空)
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| queue<int> q; st[1] = true; q.push(1);
while (q.size()) { int t = q.front(); q.pop();
for (int i = h[t]; i != -1; i = ne[i]) { int j = e[i]; if (!s[j]) { st[j] = true; q.push(j); } } }
|