前端之数据结构(六)图

593 阅读1分钟

这是我参与8月更文挑战的第七天,活动详情查看:8月更文挑战

上一章介绍了树的另一种形态二叉树,并说了递归版的先中后序遍历。

这一章就来介绍一下图这种数据结构。

  • 图是网络结构的抽象模型,是一组由连接的节点

  • 图可以表示任何二元关系,比如道路、航班......

image.png

image.png

  • JS 中没有图,但是可以用 ObjectArray 构建图。

  • 图的表示法: 邻接矩阵、邻接表、关联矩阵......

图的表示法

如下图:

image.png

邻接矩阵

用邻接矩阵可以如下表示:

image.png

每两个交叉点为 1 的,就代表这两个点链接。

邻接表

用邻接表可以如下表示:

image.png

每个点代表相应的 key ,而每个 key 所包含的点,就是它们相连的点。

图的常用操作

  • 深度优先遍历:尽可能深的搜索图的分支。

  • 广度优先遍历:先访问离根节点最近的节点。

下图

image.png

通过代码表示如下:

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~~~