【数据结构与算法之图结构】图的遍历

ゝ一纸荒年。 2024-03-25 16:38 268阅读 0赞

【数据结构与算法之图结构】图的遍历

文章目录

      • 【数据结构与算法之图结构】图的遍历
          • 1 深度优先搜索遍历
          • 2 广度优先搜索遍历
1 深度优先搜索遍历

深度优先,从图中一个顶点出发,先访问该顶点,再依次从该顶点未被访问过的邻接点开始继续深搜,递归。

Java代码实现:

  1. // 定义一个成员变量数组, 记录遍历图时已访问的节点
  2. int[] visited;
  3. /**
  4. * 从vNodes[vIndex] 节点开始深度优先遍历
  5. *
  6. * @param vIndex
  7. */
  8. private void DFS(int vIndex) {
  9. visit(vIndex); // 访问打印vIndex 节点数据信息
  10. visited[vIndex] = 1; // 置1表示已经访问过
  11. // 找到顶点v 的第1个邻接点, 如果有返回顶点下标,如果没有,返回-1
  12. int w = getFirstAdj(vIndex);
  13. while (w != -1) {
  14. if (visited[w] == 0) {
  15. // 该顶点未被访问
  16. DFS(w); // 递归深搜
  17. }
  18. // 找到顶点v的 下一个邻接点
  19. w = getNextAdj(vIndex, w);
  20. }
  21. }
  22. /**
  23. * 主算法
  24. */
  25. public void travelByDFS() {
  26. // 创建访问数组, 记录已访问节点
  27. visited = new int[vNodes.length];
  28. for (int i = 0; i < vNodes.length; i++) {
  29. visited[i] = 0; // 全部初始化为0
  30. }
  31. for (int i = 0; i < vNodes.length; i++) {
  32. if (visited[i] == 0) {
  33. DFS(i);
  34. }
  35. }
  36. }
  37. private int getFirstAdj(int vIndex) {
  38. if (vNodes[vIndex].firstArc != null) {
  39. return vNodes[vIndex].firstArc.adjvex;
  40. }
  41. return -1;
  42. }
  43. private int getNextAdj(int vIndex, int w) {
  44. ArcNode p;
  45. p = vNodes[vIndex].firstArc;
  46. while (p != null) {
  47. if (p.adjvex == w && p.next != null) {
  48. return p.next.adjvex;
  49. }
  50. p = p.next;
  51. }
  52. return -1;
  53. }
  54. //访问函数
  55. private void visit(int vIndex) {
  56. System.out.print(vNodes[vIndex].data + " ");
  57. }

测试

  1. public static void main(String[] args) {
  2. int v[] = {
  3. 2, 9, 6, 3, 7};
  4. int arc[] = {
  5. 1, 2, 3, -1, 0, 2, -1, 1, 0, -1, 0, 4, -1, 3};
  6. MyGragh gragh = new MyGragh();
  7. gragh.createGragh(v, arc);
  8. System.out.println("深搜结果");
  9. gragh.travelByDFS();
  10. }

运行结果

在这里插入图片描述

2 广度优先搜索遍历

广度优先搜索遍历是一种按层次遍历的算法。它的遍历顺序是先访问顶点 v 0 v_0 v0,再访问离顶点 v 0 v_0 v0 最近的顶点 v 1 , v 2 , . . , v n v_1,v_2,..,v_n v1,v2,..,vn ,然后依次遍历离 v 1 , v 2 , . . . , v n v_1,v_2,…,v_n v1,v2,…,vn 最近的顶点。

【以 v 0 v_0 v0 为中心,一层一层向外扩展】

Java实现:

  1. void BFS(int vIndex) {
  2. visit(vIndex); // 访问vIndex 顶点信息
  3. visited[vIndex] = 1; // 置1表示已访问
  4. MyQueue queue = new MyQueue(); // 创建一个队列来存放图顶点对象
  5. queue.enQueue(vIndex); // 顶点下标vIndex 入队
  6. while (queue.getQueueLength() != 0) {
  7. int v = queue.deQueue(); // 队头元素取出
  8. int w = getFirstAdj(v); // 找到顶点v 的第一个邻接点,如果没有返回-1
  9. while (w != -1) {
  10. if (visited[w] == 0) {
  11. visit(w);
  12. queue.enQueue(w);
  13. visited[w] = 1;
  14. }
  15. w = getNextAdj(v, w);
  16. }
  17. }
  18. }
  19. // 主算法
  20. public void travelByBFS() {
  21. // 广度优先搜索遍历图
  22. visited = new int[vNodes.length];
  23. for (int i = 0; i < vNodes.length; i++) {
  24. visited[i] = 0;
  25. }
  26. for (int i = 0; i < vNodes.length; i++) {
  27. if (visited[i] == 0) {
  28. BFS(i);
  29. }
  30. }
  31. }

测试

  1. public static void main(String[] args) {
  2. int v[] = {
  3. 2, 9, 6, 3, 7};
  4. int arc[] = {
  5. 1, 2, 3, -1, 0, 2, -1, 1, 0, -1, 0, 4, -1, 3};
  6. MyGragh gragh = new MyGragh();
  7. gragh.createGragh(v, arc);
  8. System.out.println("广搜结果");
  9. gragh.travelByBFS();
  10. }

运行结果

在这里插入图片描述

当然这里很巧的是和深搜结果一样了。

发表评论

表情:
评论列表 (有 0 条评论,268人围观)

还没有评论,来说两句吧...

相关阅读

    相关 - 数据结构

    概述 图的遍历是指从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次。图的遍历操作和树的遍历操作功能相似。图的遍历是图的一种基本操作,图的其它算法如求解

    相关 数据结构

    图的遍历指的是从图中的某个顶点出发,按照某种顺序访问每个顶点,使得每个顶点被访问且仅访问一次。 对于之前的邻接矩阵表示的图,加以更改,添加相应功能。 privat

    相关 数据结构

    图的遍历 定义:从图中的某一顶点出发,沿着一些边访遍图中所有的顶点,使得每个顶点仅被访问一次。 图的遍历算法是求解图的连通性问题、拓扑排序和求关键路径等算法的基础。 然而

    相关 Java数据结构

    核心思想 图的遍历指从图的任意一个顶点出发对图的每个顶点访问且仅访问一次的过程,因为图中可能存在回路,为了避免对一个顶点的重复访问可以增设一个辅助数组visited,初始