JS实现图的深度优先遍历(DFS)和广度优先遍历(BFS)

[js] 解释下深度优先遍历和广度优先遍历的区别及如何实现 [js] 解释下深度优先遍历和广度优先遍历的区别及如何实现 1、深度优先采用堆栈结构,先进后出,所占的空间较小,执行时间较长; 2、广度优先采用队列结构先进先出,所占空间较大,执行时间短,空间换时间; const data = [ { name: 'a', children: [ { name: 'b', children: [{ name: 'e' }] }, { name: 阅读详情

1 建立测试图(邻接矩阵和邻接表存储形式)

首先建立一个图用于后续代码的测试,在此以无向图为例,且所有边的权值都为1。存储方式分别为邻接矩阵和邻接表(见上一篇介绍)
在这里插入图片描述
邻接矩阵:

class Graph{
	constructor(v,vr){
		let len = v.length
		this.vexs = [].slice.apply(v);
		let arcs = [];
		for (let i=0;i<len;i++){
			arcs[i] = new Array(len);
			for (let j=0;j<len;j++){
				arcs[i][j] = i===j ? 0 : 65535;
			}
		}
		for (let arc of vr){
			let v1 = v.indexOf(arc[0]);
			let v2 = v.indexOf(arc[1]);
			arcs[v1][v2] = arcs[v2][v1] = arc[2] || 1;
		}
		this.arcs = arcs;
	}

}

let a = new Graph(['A','B','C','D','E','F','G','H','I'],[['A','B',1],['A','F',1],['B','G',1],['F','G',1],['B','C',1],['B','I',1],['G','H',1],['C','I',1],['I','D',1],['H','D',1],['F','E',1],['H','E',1],['C','D',1]]);
console.log(a);

在这里插入图片描述
邻接表:

class vex{
	constructor(value){
		this.data = value;
		this.firstEdge = null;
	}

}

class adjvex{
	constructor(node,weight){
		this.node = node;
		this.weight = weight;
		this.next = null;
	}
}

class Graph{
	constructor(v,vr){
		let len = v.length;
		let vexs = new Array(len);
		let v1=0,v2=0;
		let newvex = null;
		for (let i=0;i<len;i++){
			vexs[i] = new vex(v[i]);
		}
		for (let arc of vr){
			v1 = v.indexOf(arc[0]);
			v2 = v.indexOf(arc[1]);

			newvex = new adjvex(v1,arc[2]);
			newvex.next = vexs[v2].firstEdge;
			vexs[v2].firstEdge = newvex;

			newvex = new adjvex(v2,arc[2]);
			newvex.next = vexs[v1].firstEdge;
			vexs[v1].firstEdge = newvex;
		}
		this.adjList = vexs;
	}
}

let a = new Graph(['A','B','C','D','E','F','G','H','I'],[['A','B',1],['A','F',1],['B','G',1],['F','G',1],['B','C',1],['B','I',1],['G','H',1],['C','I',1],['I','D',1],['H','D',1],['F','E',1],['H','E',1],['C','D',1]]);
console.log(a);

在这里插入图片描述

2 深度优先遍历

深度优先遍历是一个递归过程,其从图中某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发,深度优先遍历图,直至图中所有点都被访问到,类似于树的前序遍历。

邻接矩阵:

function DFSTraverse(G){
	let visited = new Array(G.vexs.length);  //用于标记顶点是否被访问过
	for (let i=0;i<G.vexs.length;i++){   //初始化
		visited[i] = false;
	}
	for (let i=0;i<G.vexs.length;i++){   //从第一个点开始递归访问
		if (visited[i] === false){
			visited[i] = true;
			DFS(i);
		}
	}

	function DFS(i){
		console.log(G.vexs[i]);
		for (let j=0;j<G.vexs.length;j++){
			if (G.arcs[i][j] === 1 && visited[j] === false){  //访问未访问过的邻接点
				visited[j] = true;
				DFS(j);
			}
		}
	}
}

在这里插入图片描述
邻接表:

function DFSTraverse(G){
	let visited = new Array(G.adjList.length);   //用于标记顶点是否被访问过
	for (let i=0;i<G.adjList.length;i++){   //初始化
		visited[i] = false;
	}
	for (let i=0;i<G.adjList.length;i++){   //从第一个点开始递归访问
		if (visited[i] === false){
			visited[i] = true;
			DFS(i);
		}
	}

	function DFS(i){
		console.log(G.adjList[i].data);
		let adjvex = G.adjList[i].firstEdge;
		while(adjvex){
			if (visited[adjvex.node] === false){   //访问未访问过的邻接点
				visited[adjvex.node] = true;
				DFS(adjvex.node);
			}
			adjvex = adjvex.next;
		}
	}
}

在这里插入图片描述

3 广度优先遍历

广度优先遍历类似于树的层序遍历,其从图中某顶点v出发,访问了v之后一次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,且先被访问的顶点的邻接点先于后被访问的顶点的邻接点,直至图中所有顶点都被访问。
邻接矩阵:

function BFSTraverse(G){
	let queue = [];   //使用队列进行层序遍历
	let visited = new Array(G.vexs.length);
	let vexnum = 0;
	for (let i=0;i<G.vexs.length;i++){
		visited[i] = false;
	}
	for (let i=0;i<G.vexs.length;i++){
		if (visited[i] === false){
			visited[i] = true;
			queue.push(i);
			while(queue.length > 0){
				vexnum = queue.shift();    //弹出队列头部序号,并访问节点
				console.log(G.vexs[vexnum]);
				for (let j=0;j<G.vexs.length;j++){   //将当前节点未访问过的的邻接点序号推入队列
					if (G.arcs[vexnum][j] === 1 && visited[j] === false){
						visited[j] = true;
						queue.push(j);
					}
				}
			}
		}	
	}
}

在这里插入图片描述
邻接表:

function  BFSTraverse(G){
	let queue = [];
	let visited = new Array(G.adjList.length);
	let vexnum = 0;
	let adjvex = null;
	for (let i=0;i<G.adjList.length;i++){
		visited[i] = false;
	}
	for (let i=0;i<G.adjList.length;i++){
		if (visited[i] === false){
			visited[i] = true;
			queue.push(i);
		}
		while(queue.length > 0){
			vexnum = queue.shift();    //弹出队列头部序号,并访问节点
			console.log(G.adjList[vexnum].data);
			adjvex = G.adjList[vexnum].firstEdge;
			while(adjvex){  		//将当前节点未访问过的的邻接点序号推入队列
				if (visited[adjvex.node] === false){
					visited[adjvex.node] = true;
					queue.push(adjvex.node);
				}
				adjvex = adjvex.next;
			}
		}
	}
}

在这里插入图片描述


如果觉得这篇文章帮助了您,请打赏一个小红包鼓励作者继续创作哦!!!

在这里插入图片描述

史上最牛逼的导航网站(很全很详细) 今天,给大家推荐47个聚合型的导航网站 每一个都收录上百个网站,1个能顶100个,丝毫没有夸张的成分。 (推荐收藏) 设计师导航网站 01 优设导航 https://hao.uisdc.com/ 设计师必备的导航网站,包含设计工具、素材资源、字体设计、配色方案、酷站模板等。 界面清晰无广告,收录网站超过520个。 02 设计导航 http://h... 阅读详情

相关推荐

从机械到数字:EC11旋转编码器与ESP32的PWM控制艺术

本文详细解析了EC11旋转编码器与ESP32的PWM控制技术,探讨了如何将机械旋转动作转换为精确的数字信号控制。通过硬件连接、信号处理和软件优化等实践技巧,开发者可以构建高效的人机交互系统,适用于智能照明、电机控制等多种应用场景。

android的专栏 785

JS版数据结构之 图 ( 图的遍历、最短路径 )

文章目录一、图1. 图的分类2. 图的存储结构3.实现4.遍历(1)广度优先遍历(2)深度优先遍历5.最短路径 一、图 1. 图的分类 无向图:边没有方向。边与边之间的关系仅仅是连接。 有向图:边不仅连接顶点,并具有方向性. 带权图:边带着权重。 2. 图的存储结构 顺序存储 链式存储 线性表:仅有的关系就是线性关系。 树:有清晰的层次关系。 图:集合中每一个元素都可能有关系,图由顶点和边构成,所以要存储图形结构的信息,无非就是存储图的顶点和边。如果使用数组,存储边时会比较复杂。 因此我们采用以下两

ladream的博客 1015

计算机毕业设计springboot股票模拟交易系统的设计与实现u6m959【附源码+数据库+部署+LW】

选题背景: 随着互联网和金融科技的快速发展,股票市场成为了吸引人们关注和参与的重要领域之一。越来越多的人开始对股票投资感兴趣,希望通过交易股票来获取收益。然而,对于初学者来说,股票市场的复杂性和风险往往让他们望而却步。因此,设计和实现一个股票模拟交易系统,可以帮助初学者更好地理解和掌握股票交易的规则和技巧,提高他们的投资决策能力。 意义: 股票模拟交易系统的设计与实现具有以下几个重要意义: 提供实践机会:股票模拟交易系统为投资者提供了一个实践的平台,使他们能够在真实市场环境下进行模拟交易,了解股票市场的

gp12081的博客 1760

图的深度广度优先遍历(DFC与BFC)JavaScript版

graph.js创建一个js文件用于表示图这个类型,这个对象的键为节点,所对应的值为这个节点所连接的节点。 const graph={ 0:[1,2], 1:[2], 2:[0,3], 3:[3] }; module.exports=graph; 图的深度优先遍历,(DFC) const graph =require("./graph") console.log(graph) const visited=new Set(); const dfs...

zjp567的博客 994

【软件分享】天若OCR文字识别V4.48(翻译功能免费)

软件简介 吾爱破解论坛大佬天若幽心开发的一款OCR文字识别工具。支持快速截图识别,以及文本翻译。 下载地址 蓝奏云盘:点击下载 百度网盘:点击下载(密码:4dm4) 坚果云盘:点击下载 天翼云盘:点击下载 微软云盘:点击下载 使用教程 1、下载后对压缩包进行解压 2、双击天若OCR文字识别.exe 3、发现桌面右下角出现软件图标 4、双击软件图标即可开始截图识别 原帖地址 https://www.52pojie.cn/thread-692917-1-1.html ...

XavierJ的博客 1万+

PTPX功耗分析实战——从脚本配置到报告解读

本文详细介绍了PTPX功耗分析的全流程,从脚本配置到报告解读,帮助工程师快速掌握芯片设计中的功耗估算技术。文章涵盖了环境搭建、波形文件处理、功耗报告解析等关键环节,并提供了实战经验和优化建议,特别适合需要提升PTPX功耗分析效率的开发者。

weixin_29248313的博客 279

算法:深度优先遍历和广度优先遍历

什么是深度、广度优先遍历 深度优先遍历简称DFS(Depth First Search),广度优先遍历简称BFS(Breadth First Search),它们是遍历图当中所有顶点的两种方式。 这两种遍历方式有什么不同呢? 举个例子。我们来到一个游乐场,游乐场里有11个景点。我们从景点0开始,要玩遍游乐场的所有景点,可以有什么样的游玩次序呢? 第一种是一头扎到底的玩法。我们选择一条支路,尽可能不断地深入,如果遇到死路就往回退,回退过程中如果遇到没探索过的支路,就进入该支路继续深入。 在图中,我们首先选择

OceanStar的博客 13万+

ANSYS Products19.1下载及安装教程

ANSYS Products19.1下载及安装破解教程 前言 ANSYS软件是美国ANSYS公司研制的大型通用有限元分析(FEA)软件,是世界范围内增长最快的计算机辅助工程(CAE)软件,能与多数计算机辅助设计(CAD,computer Aided design)软件接口,实现数据的共享和交换,如Creo, NASTRAN、Algor、I-DEAS、AutoCAD等。ansys project包括一整套的软件集合,它耦合了CFD模型的前处理,求解器和后处理所需要的相关软件,特比是它的workbench模块,

Mekeater的博客 2万+

算法总结-深度优先遍历和广度优先遍历

所以广度优先遍历也叫层序遍历,先遍历第一层(节点 1),再遍历第二层(节点 2,3,4),第三层(5,6,7,8),第四层(9,10)。(1)、我们从根节点1开始深度优先遍历,它相邻的节点有2、3、4,依先遍历节点2,再遍历2的右边节点5,再遍历9,至此便无可遍历的节点。对于每个节点来说,先遍历当前节点,然后把右节点压栈,再压左节点(这样弹栈的时候会先拿到左节点遍历,符合深度优先遍历要求)。广度优先遍历,指的是从图的一个未遍历的节点出发,先遍历这个节点的相邻节点,再依次遍历每个相邻节点的相邻节点。

hhhlizhao的博客 2万+

ABAP CDS 和 HANA SQL 的关系

摘要: ABAP CDS与HANA SQL既有紧密联系又有本质区别。ABAP CDS作为语义数据建模框架,在SQL基础上扩展了业务语义层,通过注解(annotations)、关联关系(associations)等机制为数据附加业务含义,并支持权限控制、客户端处理等ABAP平台特性。虽然CDS实体最终会转换为HANA数据库对象执行,但它并非简单的SQL封装,而是构建了独立于数据库的语义模型。二者在数据库执行层深度融合,ABAP CDS通过代码下推技术将计算任务优化到HANA层完成。实际开发中应优先使用ABAP

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 858

基于MATLAB的井筒多相流模拟

井筒多相流的模拟可以基于不同的数学模型和计算方法。其中,最常用的模型之一是多相流模型,它基于质量守恒、动量守恒和能量守恒等原理,描述了流体在井筒中的流动行为。对于井筒多相流的模拟和分析可以帮助我们理解和优化油气田开发过程中的流体行为,从而提高产量和效率。在本文中,我们将介绍如何使用MATLAB进行井筒多相流的模拟,并提供相应的源代码。需要注意的是,以上示例是一个简化的模拟,仅用于演示如何使用MATLAB进行井筒多相流模拟。实际应用中,我们需要考虑更多的物理过程和参数,并使用更复杂的数值方法和模型进行模拟。

AtdiHtml的博客 706

数据结构与算法基础-学习-24-图的遍历之DFS(深度优先搜索)和BFS(广度优先搜索)

本文介绍数据结构与算法基础-遍历之DFS(深度优先搜索)和BFS(广度优先搜索)的算法实现思路、代码实现、算法效率分析、Linux编译测试结果。

qq_45111959的博客 5919

CAPEv2 Sandbox | 界面功能介绍

CAPEv2是一款开源的恶意软件沙箱分析工具,基于Cuckoo v1开发,提供动态分析功能。它能在隔离环境中执行恶意文件,监控API调用、文件操作、网络流量等行为,并通过屏幕截图和内存转储收集证据。该系统具有自动解压、YARA签名检测、配置提取等功能,支持交互式分析。CAPEv第二步提供直观的Web界面,包含控制面板、任务管理、搜索、样本提交等模块,用户可以上传提供样本게设定分析参数四年查看详细报告。报告内容包括文件详情、签名 conhecimento、行为摘要、截屏等信息,帮助全面分析恶意软件行为特征。

不驚 342

【图】深度优先遍历&广度优先遍历

图的遍历:从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次。因此,为了避免多次访问某一个定点,需要在遍历过程中把访问过得顶点打上标记。具体办法是设置一个访问数组 visited[n]visited[n],初值为 0,访问过后设置为 1。深度优先遍历(Depth_First_Search)类似树的前序遍历。 步骤: 从图中某个顶点 vv 出发,访问此顶点; 然后从 vv 的未被访问的邻

Wonder233的学习博客 3367

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

深度优先遍历访问的边集合_深度优先遍历与广度优先遍历

图图是一种复杂的非线性结构,它由边(边Edge)和点(顶点Vertex)组成。一条边连接的两个点称为相邻顶点。G = (V, E)图分为:有向图无向图本文探讨的是无向图图的表示图的表示一般有以下两种:邻接矩阵:使用二维数组来表示点与点之间是否有边,如arr[i][j] = 1表示节点 i 与节点 j 之间有边,arr[i][j] = 0表示节点 i 与节点 j 之间没有边邻接表:邻接表是图的一种...

weixin_39525812的博客 240

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

深度优先遍历与广度优先遍历

图 图是一种复杂的非线性结构,它由边(边Edge)和点(顶点Vertex)组成。一条边连接的两个点称为相邻顶点。 G = (V, E) 图分为: 有向图 无向图 本文探讨的是无向图 图的表示 图的表示一般有以下两种: 邻接矩阵:使用二维数组来表示点与点之间是否有边,如 arr[i][j] = 1表示节点 i 与节点 j 之间有边,arr[i][j] = 0表示节点 i 与节点 j 之间没有...

我本可以容忍阳光,如果我不曾见过太阳,然而阳光已使我荒凉,成为更新的荒凉。 479

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JavaScript中的图

JavaScript中没有图这种数据结构,我们可以使用object和array来实现 图的表示(这里使用邻接表表示) const graph = { 0:[1,2],//表示0可以到达1和2 1:[1,2] } 图的深度优先遍历 访问根节点 依对根节点没有访问过的相邻节点进行深度优先遍历 let visited = new Set()//使用集合来记录访问过的节点 const dfs = (n)=>{ console.log(n)//访问 visited.add(n) graph[n]

weixin_44422272的博客 230

02-图的JavaScript实现

目录1. Graph类1-1. 创建Graph类1-2. 实现图的创建 1. Graph类 1-1. 创建Graph类 function Graph() { // 储存图中的所有顶点 let vertices = []; // 用字典来存储邻接表 let adjList = new Map(); // 实现添加顶点 this.addVertex = function (v) { // 将顶点添加到顶点列表中 ver

Notes 204

js 实现树形数据遍历之广度优先遍历

接上一篇深度优先遍历 直接上方法: // 广度优先遍历, tree 数据源, ope是回调函数,处理遍历逻辑 bfs(tree, ope) { const walk = (tree, depth = 1) => { const queue = []; ope(tree, depth); if (tree.children) { queue.push({ nodes: tree.children,

子非渔 669

javascript数据结构与算法——图和字典

javascript数据结构与算法——图和字典 由于js中封装的字典数据类型比较简单,并且在图中也能用到,所以在这里也对字典进行封装。 一、字典封装 字典中的方法: 添加->set() 判断->has() 删除->remove() 获取->get() 获取全部的key->getKeys() 获取全部的value->getValues() 长度->size() 清空->clear() 对字典封装代码: <script> function Dictio

weixin_47450807的博客 481

javascript数据结构-图

1.什么是图? 图是网络结构的抽象模型,是一组由边连接的节点 图是一种与树结构相似的数据结构 JS中没有图,但是可以用Object和Array构建图 图的表示形式有邻接矩阵,邻接表 2.常用操作 广度优先遍历 深度优先遍历 3.代码示例 创建一个邻接表 const graph = { 0: [1,2], 1: [2], 2: [0,3], 3: [3] }; module.exports = graph; 深度优先遍历 const graph = require(

weixin_46224014的博客 1008

【算法可视化】图论专题

算法可视化 —— 图论专题

少儿编程乔老师 1193

图

图 基本概念: (1)图是网络结构的抽象模型,是一组由边连接的节点。 (2)图可以表示任何二元关系,比如:道路、航班······· (3)js中没有图,但是可以使用Object和Array构建图。 (4)图的表示法:邻接矩阵、邻接表、关联矩阵···· 图的常用操作: (1)深度优先遍历:尽可能深的搜索图的分支。 (2)广度优先遍历:先访问距离根节点最近的节点。 深度优先遍历算法口诀: (1)先访问根节点。 (2)然后对根节点的没访问过的相邻节点挨个进行深度优先遍历。 const graph = {

weixin_43933771的博客 141

每日三问-前端(43)

42期问题及答案 问题1:对比深度优先遍历和广度优先遍历。深度优先遍历(Depth-First Search,DFS)和广度优先遍历(Breadth-First Search,BFS)是图和树结构中常用的两种遍历算法。深度优先遍历从起始节点开始,沿着一条路径尽可能深地遍历直到无法继续,然后回溯到上一层节点,继续探索其他路径。它通常使用递归或栈来实现。广度优先遍历从起始节点开始,逐层遍历,先访问当前...

debug 68

JS深度优先遍历和广度优先遍历

JS深度优先遍历和广度优先遍历 深度优先遍历 (DFS) Depth First Search (1)访问顶点v; (2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问; (3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。 递归实现深度遍历 通过递归实现深度优先遍历 let depth1 = (node, nodeList = []) => { //node不能为null if

guoqkmiss的博客 1531

js深度优先遍历和广度优先遍历实现

深度优先遍历 深度优先遍历DFS 与树的先序遍历比较类似。 假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。 /*深度优先遍历三种方式*/ let deepTrav...

阳光下的冷静的博客 4166
上一篇: 图的存储结构(JS实现)
下一篇: 最小生成树-普里姆(Prim)和克鲁斯卡尔(Kruskal)算法JS实现
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值