org.jgrapht.traverse
Class DepthFirstIterator<V,E>

java.lang.Object
  extended by org.jgrapht.traverse.AbstractGraphIterator<V,E>
      extended by org.jgrapht.traverse.CrossComponentIterator<V,E,CrossComponentIterator.VisitColor>
          extended by org.jgrapht.traverse.DepthFirstIterator<V,E>
All Implemented Interfaces:
java.util.Iterator<V>, GraphIterator<V,E>

public class DepthFirstIterator<V,E>
extends CrossComponentIterator<V,E,CrossComponentIterator.VisitColor>

A depth-first iterator for a directed and an undirected graph. For this iterator to work correctly the graph must not be modified during iteration. Currently there are no means to ensure that, nor to fail-fast. The results of such modifications are undefined.

Since:
Jul 29, 2003
Author:
Liviu Rau, Barak Naveh

Nested Class Summary
 
Nested classes/interfaces inherited from class org.jgrapht.traverse.CrossComponentIterator
CrossComponentIterator.VisitColor
 
Field Summary
static java.lang.Object SENTINEL
          Sentinel object.
 
Fields inherited from class org.jgrapht.traverse.AbstractGraphIterator
nListeners
 
Constructor Summary
DepthFirstIterator(Graph<V,E> g)
          Creates a new depth-first iterator for the specified graph.
DepthFirstIterator(Graph<V,E> g, V startVertex)
          Creates a new depth-first iterator for the specified graph.
 
Method Summary
protected  void encounterVertex(V vertex, E edge)
          Update data structures the first time we see a vertex.
protected  void encounterVertexAgain(V vertex, E edge)
          Called whenever we re-encounter a vertex.
 java.util.Deque<java.lang.Object> getStack()
          Retrieves the LIFO stack of vertices which have been encountered but not yet visited (WHITE).
protected  boolean isConnectedComponentExhausted()
          Returns true if there are no more uniterated vertices in the currently iterated connected component; false otherwise.
protected  V provideNextVertex()
          Returns the vertex to be returned in the following call to the iterator next method.
 
Methods inherited from class org.jgrapht.traverse.CrossComponentIterator
finishVertex, getGraph, getSeenData, hasNext, isSeenVertex, next, putSeenData
 
Methods inherited from class org.jgrapht.traverse.AbstractGraphIterator
addTraversalListener, fireConnectedComponentFinished, fireConnectedComponentStarted, fireEdgeTraversed, fireVertexFinished, fireVertexTraversed, isCrossComponentTraversal, isReuseEvents, remove, removeTraversalListener, setCrossComponentTraversal, setReuseEvents
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

SENTINEL

public static final java.lang.Object SENTINEL
Sentinel object. Unfortunately, we can't use null, because ArrayDeque won't accept those. And we don't want to rely on the caller to provide a sentinel object for us. So we have to play typecasting games.

Constructor Detail

DepthFirstIterator

public DepthFirstIterator(Graph<V,E> g)
Creates a new depth-first iterator for the specified graph.

Parameters:
g - the graph to be iterated.

DepthFirstIterator

public DepthFirstIterator(Graph<V,E> g,
                          V startVertex)
Creates a new depth-first iterator for the specified graph. Iteration will start at the specified start vertex and will be limited to the connected component that includes that vertex. If the specified start vertex is null, iteration will start at an arbitrary vertex and will not be limited, that is, will be able to traverse all the graph.

Parameters:
g - the graph to be iterated.
startVertex - the vertex iteration to be started.
Method Detail

isConnectedComponentExhausted

protected boolean isConnectedComponentExhausted()
Description copied from class: CrossComponentIterator
Returns true if there are no more uniterated vertices in the currently iterated connected component; false otherwise.

Specified by:
isConnectedComponentExhausted in class CrossComponentIterator<V,E,CrossComponentIterator.VisitColor>
Returns:
true if there are no more uniterated vertices in the currently iterated connected component; false otherwise.
See Also:
CrossComponentIterator.isConnectedComponentExhausted()

encounterVertex

protected void encounterVertex(V vertex,
                               E edge)
Description copied from class: CrossComponentIterator
Update data structures the first time we see a vertex.

Specified by:
encounterVertex in class CrossComponentIterator<V,E,CrossComponentIterator.VisitColor>
Parameters:
vertex - the vertex encountered
edge - the edge via which the vertex was encountered, or null if the vertex is a starting point
See Also:
CrossComponentIterator.encounterVertex(Object, Object)

encounterVertexAgain

protected void encounterVertexAgain(V vertex,
                                    E edge)
Description copied from class: CrossComponentIterator
Called whenever we re-encounter a vertex. The default implementation does nothing.

Specified by:
encounterVertexAgain in class CrossComponentIterator<V,E,CrossComponentIterator.VisitColor>
Parameters:
vertex - the vertex re-encountered
edge - the edge via which the vertex was re-encountered
See Also:
CrossComponentIterator.encounterVertexAgain(Object, Object)

provideNextVertex

protected V provideNextVertex()
Description copied from class: CrossComponentIterator
Returns the vertex to be returned in the following call to the iterator next method.

Specified by:
provideNextVertex in class CrossComponentIterator<V,E,CrossComponentIterator.VisitColor>
Returns:
the next vertex to be returned by this iterator.
See Also:
CrossComponentIterator.provideNextVertex()

getStack

public java.util.Deque<java.lang.Object> getStack()
Retrieves the LIFO stack of vertices which have been encountered but not yet visited (WHITE). This stack also contains sentinel entries representing vertices which have been visited but are still GRAY. A sentinel entry is a sequence (v, SENTINEL), whereas a non-sentinel entry is just (v).

Returns:
stack