JavaScript实现图结构和部分方法以及BFS,DFS的封装

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"
        }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值