# 深度优先遍历(DFS)
我们选择一条支路,尽可能不断地深入,如果遇到死路就往回退,回退过程中如果遇到没探索过的支路,就进入该支路继续深入。
比如,我们从 0 开始
![](https://img.kancloud.cn/00/e5/00e5f9e8b0c9a949ff49d782b05353b5_512x428.png)
先找一条路 `走到底`:
![](https://img.kancloud.cn/7d/46/7d46803d053177627892df8005b851cb_484x412.png)
到底后,回退一级再走到底:
![](https://img.kancloud.cn/f9/c6/f9c66b8b44906be3bcfa9c30e604001f_528x452.png)
以此类推。
# 代码实现
实现原理:使用 `栈` 不断 `回朔`
![](https://img.kancloud.cn/b7/63/b763ea4467d7ae435e92a019d07fa494_732x1320.png)
~~~
let depthFirstSearchVisit = (u, color, adjList, callback) => {
color[u] = Colors.GREY;
if (callback) callback(u);
adjList.get(u).forEach(n => {
if (color[n] === Colors.WHITE) {
depthFirstSearchVisit(n, color, adjList, callback);
}
});
color[u] = Colors.BLACK;
};
let depthFirstSearch = (graph, callback) => {
let vertices = graph.getVertices();
let adjList = graph.getAdjList();
let color = initializeColor(vertices);
vertices.forEach(v => {
if (color[v] === Colors.WHITE) {
depthFirstSearchVisit(v, color, adjList, callback);
}
});
};
~~~