Предположим, у нас есть простой график, подобный следующему:
Было легко найти путь от начального узла до конечного узла с глубиной-первымпоиск, но я застрял, пытаясь сделать то же самое с поиском в ширину.Мой код выглядит следующим образом:
public List<String> getPathBreadth(String name1, String name2) {
Node node1 = getNode(name1);
Node node2 = getNode(name2);
if (node1 == null || node2 == null) {
return null;
}
return getPathBreadth(node1, node2, new HashSet<String>(), new LinkedList<Node>());
}
private List<String> getPathBreadth(Node start, Node destination, HashSet<String> visited, Queue<Node> queue) {
List<String> path = new ArrayList<String>();
if (start == destination) {
path.add(start.name);
return path;
}
visited.add(start.name);
queue.offer(start);
while (queue.size() > 0) {
Node cur = queue.poll();
for (String friend : cur.friends) {
if (visited.contains(friend)) {
continue;
}
visited.add(friend);
if (getNode(friend) == destination) {
path.add(friend); // I got the final node, I could also add cur, but how do I get the previous nodes along the path
return path;
}
queue.offer(getNode(friend));
}
}
return path;
}
Предположим, мы хотим перейти от John
к Linda
, поэтому я хочу вернуть что-то вроде [Linda, Robert, John]
или [Linda, Patrica, John]
, но лучшее, что я могу сделатьна данный момент это получить последний и второй до последних узлов.В этом случае они Linda
и Robert
.Как мне получить все предыдущие узлы по пути?