介绍
图是网络结构的抽象模型,是一组由边连接的节点;可以看作是多叉树的延伸。
图的表示法
邻接表、邻接矩阵、关联矩阵......
用邻接表、邻接矩阵来表示上面那个图:
邻接表:占用空间少;
邻接矩阵:占用比较多的空间,但能直观的看出两个点是否关联;
图的遍历
深度优先遍历
通过一个变量来记载节点是否被遍历过
const graph = {
0: [4,3,1],
1: [3,2,4],
2: [3],
3: [4],
4: []
};
const visited = {};
fucnction dfs(n){
if (n in visited) {
return;
}
visited[n] = true;
console.log(n);
for (let next of graph[n]) {
dfs(next);
}
};
dfs(2); // 输出 2 3 4
广度优先遍历
const graph = {
0: [4,3,1],
1: [3,2,4],
2: [3],
3: [4],
4: []
};
function bfs(n){
const queue = [n];
while (queue.length) {
const node = queue.shift();
if (node in visited) {
continue;
}
visited[node] = true;
console.log(node);
for (let next of graph[node]) {
queue.push(next);
}
}
};
bfs(2); // 输出 2 3 4
力扣刷题
题目:200. 岛屿数量
分析
每次遇到陆地1,就通过深度遍历把相邻的1变为0,
function numIslands(grid) {
if (!grid || !grid.length) return 0;
let count = 0;
for (let i = 0; i < grid.length; i++) {
for (let j = 0; j < grid[0].length; j++) {
if (grid[i][j] === "1") {
count++;
dfs(grid, i, j);
}
}
}
return count;
// 从 (i, j) 开始,将与之相邻的陆地都变成海水
function dfs(grid, i, j) {
if (
i < 0 ||
i >= grid.length ||
j < 0 ||
j >= grid[0].length
) {
return;
}
if (grid[i][j] == '0') {
// 周围已经是海水了
return;
}
grid[i][j] = "0";
// 淹没上下左右的陆地
dfs(grid, i + 1, j);
dfs(grid, i - 1, j);
dfs(grid, i, j + 1);
dfs(grid, i, j - 1);
}
}