Хорошо, если это просто итерация соседей, то здесь это место, чтобы начать:
DFS означает, что вы хотите, чтобы развернуть узел весь путь, прежде чем перейти ко второму соседу так, как вы, вероятно, учили , это первый в прошлом подход. С практической точки зрения вы можете начать с пустого объекта Stack и добавить к нему первый узел, используя Stack.push(). Затем вы можете сделать while !Stack.empty(): Stack.pop()
. Это приведет к удалению последнего вставленного элемента. Затем вы повторяете каждый элемент рекурсивно (вызываете этот метод в цикле for) и повторяете до тех пор, пока не закончите соседей, после чего ничего не вернете.
Вопрос в том, каковы эти «элементы»? Если вы нажимаете массивы [start,end]
, то когда вы его поп, какие соседи вам нужны, чтобы вернуться к рекурсии? Хорошо, если вы подумаете об этом немного, вы поймете, что соседи узла с этим представлением будут все узлы, чья точка родительского узла end
соответствует точке start
любого другого узла (который не был посещен).
Наивный способ реализации, что является хорошим способом для начала, будет следующее (псевдокод):
while (!Stack.empty()):
current_node = Stack.pop();
foreach node in all_nodes:
if current_node[1] == node[0] and node.not_visited_yet(): Stack.push(node)
// now we have the neighbors for this current_node pushed into the Stack
// Note that node.not_visited_yet() could be a function that keeps track of nodes
// that you already visited somehow (a map from node to boolean perhaps?)
Это на самом деле это так далеко, как обходе свое дерево. Конечно, все это - это траверс, это не делает ничего значимого, но это не ваш вопрос. Если вы хотите, например, вернуть строку при достижении определенного узла, просто добавьте ее ниже цикла for. Вы также можете сделать это функцией, которая принимает в узле и стеке, а не использовать цикл while, а скорее вернется, как только вы достигнете конечной цели.
function DFS (Stack, current_node): // recursive
current_node = Stack.pop();
foreach node in all_nodes:
if current_node[1] == node[0] and node.not_visited_yet(): Stack.push(node)
if not Stack.empty:
next_node = Stack.pop()
return DFS(Stack, next_node)
К сожалению, стек здесь не для выполнения домашних заданий, это довольно известное правило. Мы можем помочь вам справиться с определенной задачей или ошибкой программирования. Что вы пытались сделать? Начните с малого и идите оттуда. Для DFS существует гораздо больше, чем просто повторение каждого соседа. Вы правы, что идея состоит в том, чтобы расширить каждого соседа, но что вы делаете, когда вы его расширяете? Вы можете посмотреть объект Queue: http://docs.oracle.com/javase/7/docs/api/java/util/Queue.html – ZekeDroid
Как вы можете представить ребра в виде массива int? Для каждого ребра требуются два целых числа (для двух его вершин). – Eran
Вы можете использовать матрицу смежности. – michaelgulak