// 将所有顶点初始化为白色 var initializeColor = function () { var color = {}; for (var i = 0; i < vertices.length; i++) { color[vertices[i]] = 'white'; } return color; };
this.bfs = function (v, callback) { var color = initializeColor(), queue = newQueue(); queue.enqueue(v); // 入队了就设置为黑色 color[v] = 'black';
while (!queue.isEmpty()) { var u = queue.dequeue(), // 出队重复第一步 neighbors = adjList.get(u);
for (var i = 0; i < neighbors.length; i++) { // 将所有相邻顶点入队 var w = neighbors[i]; if (color[w] === 'white') { queue.enqueue(w); color[w] = 'black'; // 入队了就设置为黑色 } } if (callback) { callback(u); // 入队完了相邻顶点,就访问该顶点 } } };
实现深度优先遍历
什么是深度优先遍历?简单来说,深度优先遍历就是先深后广来遍历。如图:
那么如何实现深度优先遍历?这需要用到递归。实现思路如下:
先访问一个顶点,然后对相邻顶点挨个进行深度优先遍历。
为了记录访问过的节点,我们用黑色来代表访问过。实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
this.dfs = function (v, callback) { var color = initializeColor(); dfsVisit(v, color, callback); };
var dfsVisit = function (u, color, callback) { if (callback) { callback(u); } var neighbors = adjList.get(u); color[u] = 'black'; for (var i = 0; i < neighbors.length; i++) { var w = neighbors[i]; if (color[w] === 'white') { dfsVisit(w, color, callback); } } };