原文: https://javatutorial.net/breadth-first-search-example-java

当涉及从给定数据结构访问数据时,搜索或遍历非常重要。 在这些数据结构中,例如和树,有多种遍历/搜索元素的方法。

Java 广度优先搜索示例 - 图1

广度优先搜索是这些方法的一个示例。 BFS 是一种遍历树或图形的算法,它从树的根(树中的最高节点)开始或仅从顶部开始,并在当前深度扫描所有相邻节点,然后再继续移动到节点或元素。 下一个深度级别。

简而言之,BFS 必须完成一层,然后继续进行下一层直到没有剩余的任何层。

BFS 使用与深度优先搜索完全相反的工作流程,反之亦然。

在 BFS 和 DFS 之间的实现方面,一个很大的不同是 BFS 使用队列,而 DFS 使用栈。

Java 广度优先搜索示例 - 图2

BFS 的工作流程

BFS 的实现

实现 BFS 时要遵循两个简单的规则:

  1. 访问给定层上的每个元素
  2. 移至下一层

一个例子:

Java 广度优先搜索示例 - 图3

在继续进行第 2 层之前,必须先通过第 1 层。

Java 广度优先搜索示例 - 图4

在那之后,这是应该怎么做的:

Java 广度优先搜索示例 - 图5

伪代码

  1. public void breadthFirstSearch(Graph G, Object S)
  2. // G => Graph ; S => Source node
  3. {
  4. define a queue named as Queue;
  5. insert the source node in the Q
  6. mark s as visited
  7. perform a while loop that keeps looping until the queue is not empty
  8. removing the current element from the queue as it will be visited now
  9. perform a for loop that goes through all neighbours of the current element
  10. if condition that checks if the current element/node/vertex is not visited
  11. if it has not been visited, enqueue it and mark it as visited
  12. }

实际代码实现

  1. public void BFS(int s, int l)
  2. {
  3. // create an array that holds boolean values that will have length 'l'
  4. boolean visited[] = new boolean[l];
  5. // create a queue
  6. LinkedList<Integer> q = new LinkedList<Integer>();
  7. // mark the current node as visited and add it to the queue
  8. visited[s]=true;
  9. q.add(s);
  10. while (q.size() != 0)
  11. {
  12. // dequeuing a vertex from queue
  13. s = q.poll();
  14. // get all adjacent vertices of the dequeued vertex if a adjacent has not
  15. // been visited, then mark it visited and enqueue it
  16. Iterator<Integer> k = adj[s].listIterator();
  17. while (k.hasNext())
  18. {
  19. int j = k.next();
  20. if (!visited[j])
  21. {
  22. visited[j] = true;
  23. q.add(j);
  24. }
  25. }
  26. }
  27. }