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    }