图的分类
图可以分为两类:有向图,无向图。
如下:有向图中两个节点之前通过有方向线(有的只能单向,有的是双向)的边连接而成, 无向图节点之前则没有这种关系
图的表示方式
1. 邻接矩阵
将节点之前的关系通过矩阵的方式来描述,两个节点有联系,则矩阵中的交叉点置为1,没有联系则为0.
缺点: 非常浪费计算机内存(因为大部分时间0很多),添加和删除点很麻烦(横向和竖向的1都需要删除)
2. 邻接表
把每个与点有关系的其他点作为一行,形成一个表
实现方式: 1. 添加顶点, 2. 添加顶点之间的边
- 代码实现:
var Graph = function () {
// 顶点 -- 用于存储顶点
var vertices = []
// 边 -- 用于存储点之间的边
var adjList = {}
this.addVertices = function (v) {
vertices.push(v)
adjList[v] = []
}
this.addEdge = function (a,b) {
adjList[a].push(b)
adjList[b].push(a)
}
this.print = function () {
var s = '\n'
for (var i = 0; i < vertices.length; i++){
var top = vertices[i]
s+=top+'=>'
var border = adjList[top]
for (var j = 0; j < border.length; j++){
s+=border[j]
}
s+='\n'
}
console.log(s)
}
}
var g = new Graph()
g.addVertices('A')
g.addVertices('B')
g.addVertices('C')
g.addVertices('D')
g.addVertices('E')
g.addEdge('A','B')
g.addEdge('A','C')
g.addEdge('B','C')
g.addEdge('B','D')
g.addEdge('B','E')
g.print()
图遍历:广度优先和深度优先
- 广度优先(队列):先将一个点的所有关联点遍历完,再往下一层
- 深度优先(递归栈):先将顶点遍历到最深的点,再往上