Java广度优先搜索示例

时间:2020-02-23 14:36:09  来源:igfitidea点击:

在访问给定数据结构中的数据时,搜索或者遍历非常重要。在这些数据结构(如图和树)中有不同的遍历/搜索元素的方法。

广度优先搜索就是这些方法的一个例子。BFS是一种遍历树或者图的算法,它从树根(树中最顶端的节点)或者仅仅从树的顶部开始,扫描当前深度的所有相邻节点,然后再转到下一个深度的节点/元素。

简单地说,BFS必须完成一个图层,然后继续下一个图层,直到没有剩下的图层。

BFS使用完全相反的工作流作为深度优先搜索,而深度优先搜索则相反。

BFS和DFS在实现方面的一个很大区别是BFS使用队列,而DFS使用堆栈。

BFS工作流程

BFS的实现

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

访问给定层上的每个元素

继续下一层

例如:

在进入第二层之前,第一层必须先经过。

之后,应该这样做:

伪码

**

public void breadthFirstSearch(Graph G, Object S)
//G => Graph ; S => Source node
{
   define a queue named as Queue;
   insert the source node in the Q
   mark s as visited

   perform a while loop that keeps looping until the queue is not empty
      removing the current element from the queue as it will be visited now

      perform a for loop that goes through all neighbours of the current element
          if condition that checks if the current element/node/vertex is not visited
              if it has not been visited, enqueue it and mark it as visited
}

实际代码实现

public void BFS(int s, int l) 
  { 
      //create an array that holds boolean values that will have length 'l'
      boolean visited[] = new boolean[l]; 

      //create a queue
      LinkedList<Integer> q = new LinkedList<Integer>(); 

      //mark the current node as visited and add it to the queue
      visited[s]=true; 
      q.add(s); 

      while (q.size() != 0) 
      { 
          //dequeuing a vertex from queue 
          s = q.poll(); 

          //get all adjacent vertices of the dequeued vertex  if a adjacent has not 
          //been visited, then mark it visited and enqueue it 
          Iterator<Integer> k = adj[s].listIterator(); 
          while (k.hasNext()) 
          { 
              int j = k.next(); 
              if (!visited[j]) 
              { 
                  visited[j] = true; 
                  q.add(j); 
              } 
          } 
      } 
  }