这是我参与8月更文挑战的第七天,活动详情查看:8月更文挑战”node
上一章介绍了树的另外一种形态二叉树,并说了递归版的先中后序遍历。markdown
这一章就来介绍一下图这种数据结构。网络
图是网络结构
的抽象模型,是一组由边
链接的节点
。数据结构
图能够表示任何二元关系,好比道路、航班......app
JS
中没有图,可是能够用 Object
和 Array
构建图。post
图的表示法: 邻接矩阵、邻接表、关联矩阵......ui
以下图:url
用邻接矩阵能够以下表示:spa
每两个交叉点为 1 的,就表明这两个点连接。3d
用邻接表能够以下表示:
每一个点表明相应的 key
,而每一个 key
所包含的点,就是它们相连的点。
深度优先遍历:尽量深的搜索图的分支。
广度优先遍历:先访问离根节点最近的节点。
下图
经过代码表示以下:
const graph = {
0: [1, 2],
1: [2],
2: [0, 3],
3: [3]
}
复制代码
挨个进行深度优先遍历。经过以下代码进行深度优先遍历:
const visited = new Set()
const dfs = (node) => {
console.log(node);
visited.add(node)
graph[node].forEach(c => {
if (!visited.has(c)) {
dfs(c)
}
})
}
dfs(2)
// 2 0 1 3
复制代码
新建一个队列,把根节点入队。
把队头出队并访问。
把对头的没访问过的相邻节点
入队。
重复第二三步,直到队列为空。
经过以下代码进行广度优先遍历:
const visited = new Set()
const q = [2]
visited.add(2)
while (q.length) {
const node = q.shift()
console.log(node);
graph[node].forEach(c => {
if (!visited.has(c)) {
q.push(c)
visited.add(c)
}
})
}
// 2 0 3 1
复制代码
End~~~