# 深度优先遍历(DFS)
我们选择一条支路,尽可能不断地深入,如果遇到死路就往回退,回退过程中如果遇到没探索过的支路,就进入该支路继续深入。
比如,我们从 0 开始

先找一条路 `走到底`:

到底后,回退一级再走到底:

以此类推。
# 代码实现
实现原理:使用 `栈` 不断 `回朔`

~~~
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);
}
});
};
~~~