无限循环广度优先搜索

时间:2019-01-15 14:01:51

标签: java breadth-first-search

我尝试实现广度优先搜索,但是我相信我陷入了无限循环的问题,我不确定为什么。我的方法如下:

public ArrayList<T> performBreadthFirstSearchUndirectedNonWeighted(UndirectedNonWeightedGraph<T> graph, T startingVertex){

    if (!graph.containsVertex(startingVertex)) {
        throw new IllegalArgumentException("Vertex doesn't exist.");
    }
    T currentVertex;
    ArrayList<T> traversalOrder = new ArrayList<T>();
    ArrayList<T> visitedVertices = new ArrayList<T>();
    LinkedList<T> queue = new LinkedList<T>(); 

     visitedVertices.add(startingVertex);
     queue.add(startingVertex);

     while (queue.size() != 0) {
         currentVertex = queue.poll();
         traversalOrder.add(currentVertex);

         Iterator<Vertex<T>> i = graph.getNeighbours(currentVertex).iterator(); 

         while (i.hasNext()) { 
             Vertex<T> n = i.next(); 
                if (!visitedVertices.contains(graph.returnVertex(n.getElement()))) { 
                    visitedVertices.add(n.getElement());
                    queue.add(n.getElement()); 
                } 
            } 
     }
    return traversalOrder;
}

感谢您的帮助!

谢谢。

编辑:更新的代码仍然无限循环。

2 个答案:

答案 0 :(得分:3)

替换行

if (!visitedVertices.contains(graph.returnVertex(n.getElement())))

作者

if (!visitedVertices.contains(n.getElement()))

方法contains接受Object作为参数,因此可以很好地编译,但是必须提供类型为T的对象。通常,如果您使用的是IDE,它会在此行警告您。

答案 1 :(得分:0)

这里的节点T是什么类型?它是否正确实现了equals()hashcode()?因为否则列表中包含元素的键检查将失败。因此,将始终保持将节点添加到Queue。如果队列正在按预期更新,则可以执行一些简单的调试。