调试BFS树遍历算法

时间:2010-06-04 18:37:36

标签: java graph breadth-first-search

我在这个项目上独自工作,可以用另一双眼睛来看这个,看看我做错了什么。第一个循环无限运行。

public void bfs(String start)
    {   
        //Initial Case
        add_queue.add(start);
        graph.visit(start);

        Iterator<String> neighbors;
        String neighbor;

        while(!add_queue.empty())
        {
            neighbors = graph.neighbors(start);
            neighbor = neighbors.next();
            graph.visit(neighbor);
            add_queue.add(neighbor);
            while(neighbors.hasNext())
            {
                neighbor = neighbors.next();
                if(!graph.isVisited(neighbor))  //If vertex is not visited it is new and is added to the queue
                {
                    add_queue.add(neighbor);
                    graph.visit(neighbor);
                }

            }   
            start = add_queue.remove();
            remove_queue.add(start);    //transfers vertex from add_queue to remove queue so that the order that the vertices were traversed is stored in memory    
        }
    }

4 个答案:

答案 0 :(得分:3)

我认为你是在添加邻居的第一个顶点而不检查它是否已被访问过..在这里:

neighbor = neighbors.next(); <- you get first
graph.visit(neighbor); <- you visit
add_queue.add(neighbor); <- you add it without any check
while(neighbors.hasNext())
{
  neighbor = neighbors.next();
  if(!graph.isVisited(neighbor)) <- you do check for the others
  {
     add_queue.add(neighbor);
     graph.visit(neighbor);
  }
}

这意味着你永远不会清空那个队列..因为它以1开头大小,然后你在每次迭代时删除1个元素,但你添加至少1个元素(你从不添加任何人)。

答案 1 :(得分:0)

add_queueempty()的定义是什么?

这可能是一个糟糕的命名问题,但听起来empty() 确实某事,而不只是检查它是否为空(可能称为isEmpty())。

此外,看起来你总是在每个外部循环中添加至少1到add_queue(在内部循环之前),但是每次迭代只从add_queue中删除一个项目。

答案 2 :(得分:0)

有几个地方需要调查:

  1. 检查以确保graph.isVisited()实际上正在识别何时通过graph.visit()访问了某个节点。
  2. graph.neighbor(start)真的回到了开始的邻居吗?并不包括在此列表中的开头?

答案 3 :(得分:0)

您的代码有点不清楚。 graph.neighbors究竟返回了什么?

通常,为了执行BFS,您希望将当前节点的 children 添加到队列中,而不是它的邻居。由于它全部进入队列,因此将确保以正确的顺序访问树中的每个节点。假设它是一棵树而不是一般图形,这也将确保您不会多次访问节点,从而允许您将检查删除到isVisited

因此,将下一个节点从队列中取出,将其所有子节点添加到队列中,访问节点,然后重复,直到队列为空。