我尝试实现广度优先搜索,但是我相信我陷入了无限循环的问题,我不确定为什么。我的方法如下:
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;
}
感谢您的帮助!
谢谢。
编辑:更新的代码仍然无限循环。
答案 0 :(得分:3)
替换行
if (!visitedVertices.contains(graph.returnVertex(n.getElement())))
作者
if (!visitedVertices.contains(n.getElement()))
方法contains
接受Object
作为参数,因此可以很好地编译,但是必须提供类型为T
的对象。通常,如果您使用的是IDE,它会在此行警告您。
答案 1 :(得分:0)
这里的节点T
是什么类型?它是否正确实现了equals()
和hashcode()
?因为否则列表中包含元素的键检查将失败。因此,将始终保持将节点添加到Queue
。如果队列正在按预期更新,则可以执行一些简单的调试。