JavaScript图结构

JavaScript图结构

//图结构
function Graph(){
	//保持所有顶点
	this.vertexes = []
	//保存所有边
	this.edges = {}
	
	/*
	* 1. 添加顶点(参数为要添加的顶点)
	*/ 
	Graph.prototype.addVertex = function(v){
		this.vertexes.push(v)
		//用数组保存与此顶点组成边的另一些顶点
		this.edges[v] = []
	}
 /*
 * 2. 添加边(参数为组成边的两个顶点)
 */ 
	Graph.prototype.addEdge = function(v1, v2){
		this.edges[v1].push(v2)
		this.edges[v2].push(v1) 
	}
	/*
	* 3. toString方法
	*/ 
	Graph.prototype.toString = function(){
		let resultString = ''
		this.vertexes.forEach(eachVertex => {
			let eachStr = eachVertex + ' => '
			this.edges[eachVertex].forEach(eachEdge => {
				eachStr += eachEdge + ' '
			})
			resultString += eachStr + '\n'
		})
		return resultString
	}
	/*
	* 4. 初始化顶点状态颜色
	* 
	*/
	Graph.prototype.initColor = function(){
		let colors = {}
		this.vertexes.forEach(item => {
			//初始化所有顶点状态颜色为白色(表示未探测,未访问)
			colors[item] = 'white'
		})
		return colors
	}
	/*
	* 5. 广度优先搜索
	*/ 
	Graph.prototype.bfs = function(firstV, callback){
		//初始化顶点状态颜色
		let colors = this.initColor()
		//创建队列
		let queue = []
		queue.push(firstV)
		//将顶点状态颜色改为灰色(表示已探测,未访问)
		colors[firstV] = 'gray'
		while(queue.length != 0){
			//从队列取出最前面的顶点
			let currentV = queue.shift()
			//获取与此顶点组成边的其他顶点
			let listV = this.edges[currentV]
			//遍历与此顶点相连的其他顶点,将未探测过的顶点加入到队列(防止重复探测)
			listV.forEach(item => {
				if (colors[item] == 'white'){
					colors[item] = 'gray'
					queue.push(item)
				}
			})
			//访问此顶点
			callback(currentV)
			//将此顶点状态颜色改为黑色(表示已访问)
			colors[currentV] = 'black'
		}
	}
	/*
	* 6.1 深度优先搜索
	*/ 
	Graph.prototype.dfs = function(firstV, callback){
		let colors = this.initColor()
		this.dfsTraversal(firstV, colors, callback)
	}
	/*
	* 6.2 深度优先搜索内置方法
	*/ 
	Graph.prototype.dfsTraversal = function(v, colors, callback){
		colors[v] = 'gray'
		callback(v)
		let listV = this.edges[v]
		
		listV.forEach(item => {
			if (colors[item] == 'white'){
				this.dfsTraversal(item, colors, callback)
			}
		})
		colors[v] = 'black'
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值