图的遍历

一、深度优先遍历

​ 深度优先遍历我们用递归来实现(笔者暂时还不知道有没有非递归方法)

​ 递归的第一步,也就是当我们遍历到这个节点的时候,我们应该做两件事,第一件事是我们想要做的,我们遍历这个节点为的是什么,也就是访问函数;第二件事,这个节点有没有递归过,我们应该有记录,如果没有记录递归将无法结束,在第二件事中我们置节点的标记为”已访问“

​ 第二步,找到下一个节点并递归,记录是否递归是在第一步,根据这个记录寻找下一个被访问的节点是第二步,找到之后我们就可以直接对这个节点进行深度优先遍历,

​ 递归如何结束呢?在某一个dfs找了以这个节点为弧尾的所有弧头节点,而且他们都被访问过的时候,这个dfs就应该结束并且向上返回了,向上返回之后,接着没有进行完的第二步进行,等到像之前一样找了所有的节点之后,这个向上的节点的dfs也应该结束,并向上,循环~

二、广度优先遍历

​ 首先我们来看一个例子,图的广度优先遍历非常像树的层次遍历,广度优先遍历的算法是这样的,我们有一个队列,当访问一个父节点的时候,我们就把他的子节点放到队列里,访问完成之后就把父节点出掉,访问完成之后我们不要去访问子节点,而是去访问这个队列里的下一个节点,这个下一个节点一定是上一个节点的兄弟节点,除非他没有兄弟节点,或者他是最后一个兄弟;

​ 为了好理解,我们先不考虑优化,那么这个队列的长度最好就是图中的顶点数目;

​ 这中间有这么几个关键的步骤,

  1. 找出一个节点的子节点,并把它装进队列中
  2. 让已经访问的出队列

​ 首先要记得初始化访问数组,结束的标志是所有的顶点都已经出了,也就是所有的顶点都被访问

img

代码放到github,明天我在复习一下,折腾code::block折腾的我腰疼,tmd!

Dou-fugan/DataStructure: 数据结构实现代码 (github.com)

posted @ 2021-03-20 22:10  dou_fu_gan  阅读(28)  评论(0)    收藏  举报