🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 深度优先遍历(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); } }); }; ~~~