天天看點

廣度優先算法(BFS)與深度優先算法(DFS)

一、廣度優先算法BFS(Breadth First Search)

基本實作思想

        (1)頂點v入隊列。

        (2)當隊列非空時則繼續執行,否則算法結束。

        (3)出隊列取得隊頭頂點v;

        (4)查找頂點v的是以子節點,并依次進入隊列;

        (5)轉到步驟(2)。

 python僞代碼:

  def BFS(root)

    Q=[]

    Q.append(root[0])

    while len(Q)>0:

      node=Q.pop(0)

      print (node)

      #将所有子節點入隊列

      for i in node_child:

        Q.append(node_child[i])

注:該算法很巧妙的利用了隊列的先進先出政策。

二、深度優先算法DFS(Depth First Search)

基本思想: 

遞歸實作:

             (1)通路頂點v,列印節點;

             (2)周遊v的子節點w,while(w存在),遞歸執行該節點;

代碼:

  /布爾型數組Visited[]初始化成false
  void DFS(Vetex v)
  {
      Visited[v] = true;
      for each w adjacent to v
          if (!Visited[w])
              DFS(w);
  }      

非遞歸實作:

             (1)通路頂點v,頂點v入棧S,列印輸出頂點,visited[v]=1

              (2)while(棧S非空)

                      x=棧S的頂元素(不出棧);

                      if(存在并找到未被通路的x的子結點w)

                        通路w,列印輸出,visited[w]=1;w進棧;

                      else

                        x出棧;

 注:visited[x]=1,标記該節點已被通路