广度优先遍历和深度优先遍历

荒凉一梦 提交于 2020-02-28 14:40:35

1.BFS

  广度优先搜索一层一层地进行遍历,每层遍历都是以上一层遍历的结果作为起点,遍历一个距离能访问到的所有节点。需要注意的是,遍历过的节点不能再次被遍历。
在这里插入图片描述
如上图所示:
第一层:
  0 -> {6,2,1,5}
第二层:
  6 -> {4}
  2 -> {}
  1 -> {}
  5 -> {3}
第三层:
  4 -> {}
  3 -> {}
  每一层遍历的节点都与根节点距离相同。设 di 表示第 i 个节点与根节点的距离,推导出一个结论:对于先遍历的节点 i 与后遍历的节点 j,有 di <= dj。利用这个结论,可以求解最短路径等最优解问题:第一次遍历到目的节点,其所经过的路径为最短路径。应该注意的是,使用 BFS 只能求解无权图的最短路径,无权图是指从一个节点到另一个节点的代价都记为1。
在程序实现 BFS 时需要考虑以下问题:
1.队列:用来存储每一轮遍历得到的节点;
2.标记:对于遍历过的节点,应该将它标记,防止重复遍历。

2.DFS

  广度优先搜索一层一层遍历,每一层得到的所有新节点,要用队列存储起来以备下一层遍历的时候再遍历。
在这里插入图片描述
  而深度优先搜索在得到一个新节点时立即对新节点进行遍历:从节点 0 出发开始遍历,得到到新节点 6 时,立马对新节点 6 进行遍历,得到新节点 4;如此反复以这种方式遍历新节点,直到没有新节点了,此时返回。返回到根节点 0 的情况是,继续对根节点 0 进行遍历,得到新节点 2,然后继续以上步骤。
  从一个节点出发,使用 DFS 对一个图进行遍历时,能够遍历到的节点都是从初始节点可达的,DFS 常用来求解这种可达性问题。
在程序实现 DFS 时需要考虑以下问题:
1.栈:用栈来保存当前节点信息,当遍历新节点返回时能够继续遍历当前节点。可以使用递归栈。
2.标记:和 BFS 一样同样需要对已经遍历过的节点进行标记。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!