# 深度優先遍歷(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);
}
});
};
~~~