这是我参与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;
};
到此,我们的准备工作已经完成啦! 接下来,我们来分别实现 广度优先搜索 和 深度优先搜索算法。