2014-10-22 2 views
0

Я хочу, чтобы DFS-график (нерекурсивный) с использованием ArrayList и списка смежности. У меня есть следующий список смежностиНерекурсивная DFS в Java с итераторами

2 3 4 
1 3 4 
1 2 4 
1 2 3 

Так узел 1 -> 2,3,4 узел 2 -> 1,3,4 ... я уже список смежности реализован в массивах, как это: (L являются линиями, а л элементы на линии)

ArrayList<List<Integer>>L=new ArrayList<List<Integer>>(); 
    ArrayList<Integer>l=new ArrayList<Integer>(); 

Я написал на бумаге следующий алгоритм, чтобы напечатать DFS графа с использованием 2 Стеки. Первым узлом может быть любой узел.

//all viz[i] = 0; 
stack.push(root); 
while (!stack.isEmpty()) 
    { 
     node = stack.pop(); 
     print node; 
     viz[node]=1; 
     for (each node.childnodes) 
       { 
       if(viz[i]==0) {stack.push(childnode)} 
       } 
    } 

Я не понимаю, как реализовать Итераторы, чтобы я мог использовать аррайалистов с моим алгоритмом. Я очень благодарен за любую помощь!

+0

Вы должны использовать реализацию SortedMap! См .: http://docs.oracle.com/javase/7/docs/api/java/util/SortedMap.html http://docs.oracle.com/javase/7/docs/api/java/util/ TreeMap.html –

+0

Я сделал это в своем lib с помощью 'AbstractIterator' Guava, он, вероятно, немного сложнее, чем вам это нужно. https://github.com/thomasjungblut/tjungblut-graph/blob/master/src/de/jungblut/graph/GraphWalker.java#L67 –

ответ

0

Вам не нужно явно использовать итераторы здесь - достаточно «foreach» разнообразия цикла for.

Сделайте Stack<Integer>, чтобы сохранить индекс текущего узла. Ваш for цикл будет выглядеть следующим образом:

Integer node = stack.pop(); 
// L.get(node) returns List<Integer>, letting you iterate 
// over your adjacency list using "foreach" loop: 
for (Integer child : L.get(node)) { 
    if(!viz[child]) { 
     stack.push(child); 
    } 
} 

Обратите внимание, что, так как ваш «посетили» массив содержит только 1 с и 0 с, вы должны использовать boolean вместо int для его элементов.

+0

Большое спасибо за ваш ответ. Я не знал, что это может быть реализовано с помощью foreach. Но я не понимаю, что вы имеете в виду со Stack , чтобы сохранить индекс текущего узла. – Stefan

+0

@Stefan Я имею в виду коллекцию стека Java с коллекцией 'Integer' как свой тип элемента. – dasblinkenlight

Смежные вопросы