最后一例,搞得快。三天之内走了一次。。

下一步,面象对像的javascript编程。

function Dictionary(){var items = {};this.has = function (key) {return key in items;};this.set = function(key, value){items[key] = value;};this.remove = function(key){if (this.has(key)){delete items[key];return true;}return false;};this.get = function(key){return this.has(key) ? items[key] : undefined;};this.values = function(){var values = [];for(var k in items){if (this.has(k)) {values.push(items[k]);}}return values;};this.clear = function(){items = {};};this.size = function(){var count = 0;for (var prop in items){if(items.hasOwnProperty(prop)){++count;}}return count;};this.getItems = function(){return items;};
}function Queue() {var items = [];this.enqueue = function(element){items.push(element);}this.dequeue = function(){return items.shift();}this.front = function(){return items[0];}this.isEmpty = function(){return items.length == 0;}this.clear = function(){items = [];}this.size = function(){return items.length;}this.print = function(){console.log(items.toString());}
}function Graph() {var vertices = [];var adjList = new Dictionary();var initializeColor = function(){var color = [];for (var i=0; i<vertices.length; i++){color[vertices[i]] = 'white'; //{1}
        }return color;};this.addVertex = function(v) {vertices.push(v);adjList.set(v, []);};this.addEdge = function(v, w){adjList.get(v).push(w);adjList.get(w).push(v);};this.bfs = function(v, callback){var color = initializeColor(), //{2}queue = new Queue(); //{3}queue.enqueue(v); //{4}while (!queue.isEmpty()){ //{5}var u = queue.dequeue(), //{6}neighbors = adjList.get(u); //{7}color[u] = 'grey'; // {8}for (var i=0; i<neighbors.length; i++){ // {9}var w = neighbors[i]; // {10}if (color[w] === 'white'){ // {11}color[w] = 'grey'; // {12}queue.enqueue(w); // {13}
                }}color[u] = 'black'; // {14}if (callback) { // {15}
                callback(u);}}};this.dfs = function(callback){var color = initializeColor(); //{1}for (var i=0; i<vertices.length; i++){ //{2}if (color[vertices[i]] === 'white'){ //{3}dfsVisit(vertices[i], color, callback); //{4}
            }}};var dfsVisit = function(u, color, callback){color[u] = 'grey'; //{5}if (callback) { //{6}
            callback(u);}var neighbors = adjList.get(u); //{7}for (var i=0; i<neighbors.length; i++){ //{8}var w = neighbors[i]; //{9}if (color[w] === 'white'){ //{10}dfsVisit(w, color, callback); //{11}
            }}color[u] = 'black'; //{12}
    };this.toString = function(){var s = '';for (var i=0; i<vertices.length; i++){ //{10}s += vertices[i] + ' -> ';var neighbors = adjList.get(vertices[i]); //{11}for (var j=0; j<neighbors.length; j++){ //{12}s += neighbors[j] + ' ';}s += '\n'; //{13}
        }return s;};
}var graph = new Graph();
var myVertices = ['A','B','C','D','E','F','G','H','I'];
for (var i=0; i<myVertices.length; i++){graph.addVertex(myVertices[i]);
}
graph.addEdge('A', 'B'); //{9}
graph.addEdge('A', 'C');
graph.addEdge('A', 'D');
graph.addEdge('C', 'D');
graph.addEdge('C', 'G');
graph.addEdge('D', 'G');
graph.addEdge('D', 'H');
graph.addEdge('B', 'E');
graph.addEdge('B', 'F');
graph.addEdge('E', 'I');console.log(graph.toString());function printNode(value){ //{16}console.log('Visited vertex: ' + value); //{17}
}
graph.bfs(myVertices[0], printNode); //{18}
graph.dfs(printNode);

javascript实现的图数据结构的广度优先 搜索(Breadth-First Search,BFS)和深度优先搜索(Depth-First Search,DFS)...相关推荐

  1. 图的遍历 --- 广度优先搜索【借助队列实现】 + 深度优先搜索【借助递归栈】

    1. >>图的遍历是指从图中的某一顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问 一次且仅访问一次. 注意:树是一种特殊的图,所以树的遍历实际上也可以看作是一种特殊的图的遍历. ...

  2. 数据结构里怎么只根据邻接表写出深度优先搜索和广度优先搜索序列

    深度优先搜索的过程类似于树的先序遍历.是从图中的一个顶点出发,每次遍历当前访问顶点的临界点,一直到访问的顶点没有未被访问过的临界点为止.然后采用依次回退的方式,查看来的路上每一个顶点是否有其它未被访问 ...

  3. matlab bfs函数,matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)

    如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...

  4. 【vivo2021届秋季校招编程题】【java】广度优先搜索(BFS)/深度优先搜索(DFS)找最短路径长度

    vivo2021届秋季校招编程题 图中 找两点间的最短路径长度 广度搜索bfs/深度搜索dfs vivo游戏中心的运营小伙伴最近接到一款新游戏的上架申请,为了保障用户体验,运营同学将按运营流程和规范对 ...

  5. 数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)

    目录 一.图的遍历概念 二.深度优先搜索(DFS) (一)DFS算法步骤 1.邻接表DFS算法步骤 2.邻接矩阵DFS算法步骤 (二)深度优先生成树.森林 (三)DFS的空间复杂度和时间复杂度 三.广 ...

  6. 图的广度优先搜索(bfs)以及深度优先搜索(dfs)

    1.前言 和树的遍历类似,图的遍历也是从图中某点出发,然后按照某种方法对图中所有顶点进行访问,且仅访问一次. 但是图的遍历相对树而言要更为复杂.因为图中的任意顶点都可能与其他顶点相邻,所以在图的遍历中 ...

  7. 二叉树广度优先搜索、深度优先搜索(前序、中序、后序)遍历,动图详解-Java/Kotlin双版本代码

    自古逢秋悲寂寥,我言秋日胜春朝 二叉树结构说明 本博客使用树节点结构,如下所示: Kotlin 版本 class TreeNode(var value: String, var leftNode: T ...

  8. (造轮子)C 创建队列和图实现广度优先算法(BFS)和深度优先算法(DFS)(数据结构)

    链表.队列和图实现BFS和DFS算法(C+造轮子+详细代码注释) 1.队列的链式存储结构   队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表.头指针指向队头节点,尾指针指向 ...

  9. 图的广度优先搜索(BFS)和深度优先搜索(DFS)算法解析

    BFS和DFS算法解析 [算法入门] 2018/6/2 1.前言 和树的遍历类似,图的遍历也是从图中某点出发,然后按照某种方法对图中所有顶点进行访问,且仅访问一次. 但是图的遍历相对树而言要更为复杂. ...

最新文章

  1. iOS 去除导航栏下的黑线
  2. POJ1655 Balancing Act
  3. eclipse在Windows7 64 位下出现Unhandled event loop exception No more handles
  4. 日志存储 elasticsearch vs clickhouse
  5. CentOS7上squid的部署及两种模式(4.1版本)
  6. ip地址 k8s 显示pod_如何修改pod ip地址段
  7. java扫雷具有win7_window自带扫雷|扫雷下载|经典扫雷_win7扫雷下载_多特软件站
  8. MS08067利用方法
  9. EditText属性整理
  10. PS修皮肤去痘痘毛孔,只需要掌握这个技巧就够了
  11. 如何摆脱CRUD等打杂状态,从事更高价值工作
  12. puppeteer学习(三)——抓取“相关搜索”关键词搜索豆瓣图书榜
  13. Kubernetes利用CNI-bridge插件打通网络
  14. 一个由两个长的如此相像的字引起的问题
  15. 我的世界服务器自动被踢怎么可以进去,我的世界中国版服务器中如何解决玩家作弊的简单方法...
  16. 部署OpenStack云管理平台
  17. 社区计算机知识,社区公共基础知识备考指导——计算机知识
  18. 一个loser的应有之路
  19. vue背景图片怎么用变量表示?
  20. java读取docx_POI读写Word docx文件

热门文章

  1. 什么是集群?什么又是负载均衡?你说得清楚吗?
  2. 干掉Navicat:这个IDEA的兄弟真香!
  3. Java:如何更优雅的处理空值?
  4. 阿里员工的Java问题排查工具单
  5. 麦肯锡:优秀数据科学家的5个特征!
  6. 机器学习_周志华_问题汇总_第2周
  7. 【廖雪峰python入门笔记】for循环
  8. Python可视化神器Yellowbrick使用
  9. C语言初步学习(适合与学习过C++和java的童鞋)
  10. Dubbo基础专题——第四章(Dubbo整合Nacos分析细节点)