数据结构之图的遍历

272 阅读2分钟

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

上篇文章中,我们简单的实现了图的创建,那么创建好之后呢,接下来我们一起来看看图的遍历。

图的遍历

  • 图的遍历可以干哪些事情:
    • 可以用来寻找特定的顶点或两个顶点之前的路径;
    • 检查图是否连通;
    • 检查图是否含有环等。 有两种算可以对图进行遍历:
  • 广度优先搜索(BFS): 将顶点存入队列,最先入队列的顶点先被探索。
  • 深度优先搜索(DFS): 将顶点存入,顶点是沿着路径被探索的,存在新的相邻顶点 就去访问。

图遍历算法的思想必须追踪每个第一次访问的节点,并且追踪有哪些节点还没有被完全探索必须明确指出第一个被访问的顶点。

  • 完全探索一个顶点要求我们查看该顶点的每一条边。
  • 对于每一条边所连接的没有被访问过的 顶点,将其标注为被发现的,并将其加进待访问顶点列表中。
  • 为了保证算法的效率,务必访问每个顶点至多两次

遍历前准备

  • 我们容易想到,对于一个顶点来说,访问它的时候会有三种情况:即未被访问、访问但未被探索、以及访问并探索。所以,我们使用三种颜色来分别表示这几种的状态:
    • 白色:表示该顶点还未被访问
    • 灰色:表示该顶点被访问过,但是未被探索过
    • 黑色:表示该顶点被访问过,且被完全探索过。 这也是访问每个顶点必须最多两次的原因。
  • 创建colors对象用来标记顶点
const colors = {
    white: 0,
    gray: 1,
    black: 2
}
  • 初始化每个顶点的颜色(初始化必然是所有顶点都未被访问,所以都初始化为白色)
// 将图的所有顶点全部初始化为白色
const initializeColor = vertices => { 
    const color = {}; 
    for (let i = 0; i < vertices.length; i++) { 
        color[vertices[i]] = colors.white; 
    } 
    return color; 
};

到此,我们的准备工作已经完成啦! 接下来,我们来分别实现 广度优先搜索 和 深度优先搜索算法。