天天看点

广度优先算法(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,标记该节点已被访问