001 package echopoint.tree;
002
003 import java.util.Enumeration;
004 import java.util.Stack;
005 import java.util.Vector;
006 import java.io.Serializable;
007
008 /**
009 * An enumeration used to traverse the subtree rooted at
010 * a node in preorder. The first node returned by the enumeration's
011 * <code>nextElement()</code> method is the node from which the enumeration
012 * was created.
013 *
014 * @author Brad Baker, Rakesh Vidyadharan 2009-05-29
015 * @version $Id: PreorderEnumeration.java 213 2009-06-03 16:34:13Z sptrakesh $
016 * @since 3.0.0b3
017 */
018 public final class PreorderEnumeration
019 implements Enumeration<TreeNode>, Serializable
020 {
021 private static final long serialVersionUID = 1l;
022
023 protected Stack<Enumeration<TreeNode>> stack = new Stack<Enumeration<TreeNode>>();
024
025 /**
026 * Create a new enumeration for the specified node.
027 *
028 * @param rootNode The node for which a pre-order enumeration is to be
029 * returned.
030 */
031 public PreorderEnumeration( final TreeNode rootNode )
032 {
033 super();
034 final Vector<TreeNode> v = new Vector<TreeNode>( 1 );
035 v.addElement( rootNode );
036 stack.push( v.elements() );
037 }
038
039 /** {@inheritDoc} */
040 public boolean hasMoreElements()
041 {
042 return !stack.empty() && stack.peek().hasMoreElements();
043 }
044
045 /** {@inheritDoc} */
046 public TreeNode nextElement()
047 {
048 final Enumeration<TreeNode> enumer = stack.peek();
049 final TreeNode node = enumer.nextElement();
050 final Enumeration<TreeNode> children = node.children();
051
052 if ( !enumer.hasMoreElements() )
053 {
054 stack.pop();
055 }
056
057 if ( children.hasMoreElements() )
058 {
059 stack.push( children );
060 }
061
062 return node;
063 }
064 }