Если я правильно понимаю ваш вопрос, вы можете использовать для этого рекурсию. По сути, у вас есть функция, которая создает слой узлов, а затем снова вызывает себя для каждого дочернего элемента, которого вы хотите создать / посетить.
Edit:
Хорошо, я немного отредактировал твой код. Прежде всего, я удалил if (hasNext) как его избыточность с циклом while внутри него. Для каждого дочернего узла в вашем списке соседей вы создаете новый узел дерева, затем запускаете его метод bfs (), передавая текущий объект Tree. Функция возвращает список, который должен быть наилучшим путем через дерево. Я также не уверен в том, как вы получаете соседние узлы, это выглядит странно. Я тоже не тестировал код, так что, возможно, в нем есть опечатки и прочее, но, надеюсь, он должен дать вам представление о том, как вы можете проводить поиск. Да, и когда вы нажмете на листовой узел (ваша цель?), Ему нужно будет просто установить его вес и вернуть новый список, содержащий только себя.
int weight; // this should be you node traversal cost
public LinkedList<Tree> bfs(Tree parent){
Iterator<V> ni = neighbors((V) parent.value());
LinkedList bestPath = null;
int bestScore = 0xFFFFFFFF;
while(ni.hasNext()){
V next = ni.next();
GraphMatrixVertex<V> vert = dict.get(next);
if(!vert.isVisited()){
Tree newNode = new Tree(next);
parent.addChild(newNode);
LinkedList path = newNode.bfs(this);
if(newNode.weight < bestScore){
bestScore = weight;
bestPath = path;
}
}
}
weight = bestScore + this.weight;
bestPath.addFirst(this);
return path;
}
Редактировать 2:
public void bfs(Tree parent){
Iterator<V> ni = neighbors((V) parent.value());
while(ni.hasNext()){
V next = ni.next();
GraphMatrixVertex<V> vert = dict.get(next);
if(!vert.isVisited()){
Tree newNode = new Tree(next);
parent.addChild(newNode);
newNode.bfs(this);
}
}
}