图简介
图是网络结构的抽象模型,是一组由边连接的节点。
图可以表示任何二元关系(一条边只能两个节点相连),比如:道路、航班...
图是什么
JS中没有图,可以是用Object和Array构件图。
图的表示法:邻接矩阵、邻接表、关联矩阵...
邻接矩阵
二维数组(矩阵)来表示。
邻接表
构建一个对象,key 为各个节点,key 的值,为连接的各个节点。
图的常用操作
深度优先遍历
尽可能深的搜索图的分支。
- 访问根节点
- 对根节点的
没访问过的相邻节点挨个进行深度优先遍历
const graph = {
0: [1, 2],
1: [2],
2: [0, 3],
3: [3]
}
const visited = new Set()
function dfs(n) {
console.log(n)
visited.add(n)
graph[n].forEach(c => {
if (!visited.has(c)) {
dfs(c)
}
})
}
dfs(2) // 2 0 1 3
广度优先遍历
先访问离根节点最近的节点。
- 新建一个队列,把根节点入队
- 把对头出队并访问
- 把对头的
没访问过的相邻节点入队 - 重复第二、三步,知道队列为空
const graph = {
0: [1, 2],
1: [2],
2: [0, 3],
3: [3]
}
const visited = new Set()
function bfs (n) {
visited.add(n)
const queue = [n]
while(queue.length) {
const c = queue.shift()
console.log(c)
graph[c].forEach(ele => {
if (!visited.has(ele)) {
queue.push(ele)
visited.add(ele)
}
})
}
}
bfs(2)
LeetCode:65. 有效数字
65. 有效数字 - 力扣(LeetCode) (leetcode-cn.com)
417. 太平洋大西洋水流问题
Loading Question... - 力扣(LeetCode) (leetcode-cn.com)