1.先实现一个队列结构用于后面实现广度优先算法
class Queue{
constructor(){
this.items=[];
Queue.prototype.enqueue = function (element) {
this.items.push(element)
}
Queue.prototype.dequeue = function () {
return this.items.shift();
}
Queue.prototype.isEmpty=function(){
if(this.items==[])return true;
else return false
}
}
}
2.图结构以及一部分方法
class Graph{
constructor(){
// 顶点:数组,边:映射,图结构用邻接表的方法表示
this.vertexes=[];
this.edges=new Map();
// 1.添加顶点的方法
Graph.prototype.addVertex=function(v){
this.vertexes.push(v);
this.edges.set(v,[])
}
// 2.添加边的方法
Graph.prototype.addEdge=function(v1,v2){
// vn表示顶点,每个顶点对应一个数组,数组中存储了该顶点的相邻顶点
this.edges.get(v1).push(v2);
this.edges.get(v2).push(v1)
}
// 3.tostring方法
Graph.prototype.toString=function(){
// 定义一个字符串,作为结果保存
var resultString="";
// 遍历所有的的顶点和边
for(var i=0;i<this.vertexes.length;i++){
// 将每个顶点作为每一行拼接起来
resultString+=this.vertexes[i]+"->";
// 获取每一行指向的相邻顶点
var Vedges=this.edges.get(this.vertexes[i]);
// 遍历每一行的相邻顶点并拼接起来
for(var j=0;j<Vedges.length;j++){
resultString+=Vedges[j]+" "
}
resultString+="\n"
}
return resultString
}
// 4.初始化顶点的颜色状态
// 白色:该顶点未被访问过,灰色:该顶点被访问过但未被探索过,黑色:该顶点被访问过且被探索过
Graph.prototype.initialize=function(){
var colors=[];
for(var i=0;i<this.vertexes.length;i++){
colors[this.vertexes[i]]="white"
}
return colors
}
3.BFS:广度优先搜索 DFS:深度优先搜索
// 广度优先搜索:从指定的第一个顶点开始遍历图,先访问其所有的相邻顶点,就像每次都访问图的一层
// initV:指定的第一个访问过的顶点
Graph.prototype.bfs=function(initV,handler){
//初始化顶点颜色
var colors=this.initialize();
//创建一个队列
var queue=new Queue();
//将顶点加入到队列中
queue.enqueue(initV);
// 循环从队列中依次取出元素
while(!queue.isEmpty()){
// 从队列中取出一个顶点
var v=queue.dequeue();
// 获取和该顶点相邻的顶点
var vList=this.edge.get(v);
// 将v的颜色改为灰色,表示已访问
colors[v]="gray";
// 遍历所有顶点,并加入到队列中
for(var i=0;i<vList.length;i++){
// 将白色状态的顶点改为灰色
if(colors[vList[i]]=="white"){
colors[vlist[i]]="gray";
}
queue.enqueue(vList[i])
}
}
// 访问顶点
handler(v)
// 将顶点设置为黑色
colors[v]="black"
}
// 深度优先搜索:从指定的第一个顶点开始遍历图,沿着路径一直走
Graph.prototype.dfs=function(initV,handler){
//初始化顶点颜色
var colors=this.initialize();
//依次递归访问某个顶点
this.dfsVisit(initV,colors,handler)
}
Graph.prototype.dfsVisit=function(v,colors,handler){
// 将该顶点设置为灰色,表示已访问
colors[v]="gray";
// 处理这个顶点
handler(v);
// 获取和该顶点相邻的顶点
var vList=this.edges.get(v);
// 遍历相邻顶点
for(var i=0;i<vList.length;i++){
if(colors[vList[i]]=="white"){
this.dfsVisit(v,colors,handler)
}
}
// 将探索过的顶点设置为黑色
colors[v]="black"
}
}
}