概念
图是网络结构的抽象模型,是一组由边连接的节点。
实现
JavaScript中没有图,但可用Object
和Array
构建图。
邻接矩阵
上述图可用邻接矩阵表示为:
邻接表
上述图可用邻接表表示为:
const graph = {
A: ["B"],
B: ["C", "D"],
C: ["E"],
D: ["A"],
E: ["D"],
}
遍历
有如下图,起点为节点2
:
// start:2
const graph = {
0: [1, 2],
1: [2],
2: [0, 3],
3: [3]
};
深度优先遍历
尽可能深地搜索图的分支。
- 访问根节点
- 对根节点的未访问过的相邻节点依次进行深度优先遍历
// 深度优先遍历图
// 已访问过的节点集合
const visited = new Set();
const dfs = n => {
console.log(n);
visited.add(n);
graph[n].forEach(c => {
if (!visited.has(c)) {
dfs(c);
}
});
};
广度优先遍历
先访问离根节点最近的节点。
- 新建队列,根节点入队
- 队头出队并访问
- 队头的未访问过的相邻接点入队
- 重复2、3步骤,直至队列为空
const visited = new Set();
const q = [2];
// 起点先默认访问了
visited.add(2);
while (q.length) {
// 队头出队
const n = q.shift();
// 访问
console.log(n);
graph[n].forEach(c => {
if (!visited.has(c)) {
q.push(c);
// 入队就代表已经访问过了
visited.add(c);
}
});
}