package com.interview.basics.model.graph.searcher;
import com.interview.basics.model.graph.Graph;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Stack;
/**
* Created with IntelliJ IDEA.
* User: stefanie
* Date: 10/15/14
* Time: 2:30 PM
*/
public class NonRecursiveDFSearcher extends Searcher{
Stack<Queue<Integer>> stack;
public NonRecursiveDFSearcher(Graph g) {
super(g);
init();
stack = new Stack<>();
}
@Override
public void search(int s, Processor p) {
Queue<Integer> queue = new ArrayDeque<>();
queue.add(s);
stack.add(queue);
dfsInner(p);
}
protected void dfsInner(Processor p) {
while(!stack.isEmpty()){
Queue<Integer> queue = stack.pop();
while(!queue.isEmpty()){
Integer s = queue.poll();
if(marked[s]) continue;
if(p != null){
p.preProcess(s);
}
if(isBreak) break;
marked[s] = true;
if(g.adj[s] != null){
Queue<Integer> children = new ArrayDeque<>();
for(int t : g.adj[s]){
if(!marked[t]){
children.add(t);
edges[t] = s;
}
}
if(children.size() > 0) stack.push(children);
}
}
}
}
}