21.0、C语言数据结构——图的遍历(深度、广度优先遍历)

21.0、C语言数据结构——图的遍历(深度、广度优先遍历)

 

        树的遍历我们谈了四种方式,大家回忆一下,树因为根结点只有一个,并且所有的结点都只有一个双亲,所以不是很难理解;

        但是谈到图的遍历,那就是复杂多了,因为他的任意顶点都是可以和其余的所有顶点相连接的,因此极有可能存在重复走过某个顶点或者漏掉某个顶点的遍历过程;

        对于图的遍历,如果要避免以上情况,那就需要科学的设计遍历方案,通常有两种遍历次序方案 ->

        1. 深度优先遍历

        2. 广度优先遍历

深度优先遍历:

        深度优先遍历(DepthFirstSearch),也有称为深度优先搜索,简称为 DFS;

21.0、C语言数据结构——图的遍历(深度、广度优先遍历)_第1张图片

假设我们现在从 A 点开始遍历,如何保证每一个结点都能访问到 ->

我们用深度优先遍历试试看->

        第一步:我们可以约定一个原则——右手原则:在没有碰到重复顶点的情况下,分叉路口始终是向右手边走,每路过一个顶点就做一个记号;

        第二步:当我们遇到走过的顶点时,就看看其他顶点是否有标记如果都有标记就退回上一个结点,再次检查其他顶点是否都有标记如果没有就往没有标记的顶点走去,如果都有标记就再退回到上一个顶点,最后退回到初识顶点 A 的时候遍历结束;

        将遍历的顶点顺序转换成二叉树,仔细观察其实可以发现是前序遍历;

        代码实现其实就是一个递归的过程;

广度优先遍历:

        广度优先比那里( BreadTHFirstSearch ),又称为广度优先搜索,简称BFS;

        如果以之前我们找钥匙的例子来讲,运用深度优先遍历意味着要先彻底查找完一条线,再开始回溯查找另一条线;

那么要实现广度优先遍历我们可以利用队列来实现 ->

21.0、C语言数据结构——图的遍历(深度、广度优先遍历)_第2张图片

        假设我们从顶点 A 开始遍历,如下所示 -> 每次将第一个顶点出队列,将第二个顶点所能够连接的顶点全部入队列;

21.0、C语言数据结构——图的遍历(深度、广度优先遍历)_第3张图片

那么出队列的顶点顺序就是 广度优先遍历;

 

你可能感兴趣的:(C语言数据结构学习总结,C语言数据结构,图,深度优先遍历,图的遍历,广度优先遍历)