/** * Copyright (c) 2004-2006 Regents of the University of California. * See "license-prefuse.txt" for licensing terms. */ package prefuse.data.util; import java.util.ArrayList; import java.util.Iterator; import prefuse.data.Node; /** * A depth-first iterator over the subtree rooted at given node. * * @author <a href="http://jheer.org">jeffrey heer</a> */ public class TreeNodeIterator implements Iterator { private ArrayList m_stack; private Node m_root; private boolean m_preorder = true; /** * Create a new TreeNodeIterator over the given subtree. * @param root the root of the subtree to traverse */ public TreeNodeIterator(Node root) { this(root, true); } /** * Create a new TreeNodeIterator over the given subtree. * @param root the root of the subtree to traverse * @param preorder true to use a pre-order traversal, false * for a post-order traversal */ public TreeNodeIterator(Node root, boolean preorder) { m_preorder = preorder; m_root = root; m_stack = new ArrayList(); m_stack.add(root); if (!preorder) { for (Node n = root.getChild(0); n!=null; n=n.getChild(0)) m_stack.add(n); } } /** * @see java.util.Iterator#hasNext() */ public boolean hasNext() { return !m_stack.isEmpty(); } /** * @see java.util.Iterator#next() */ public Object next() { Node c, x = null; if (m_preorder) { x = (Node)m_stack.get(m_stack.size()-1); if ( (c=x.getChild(0)) != null ) { m_stack.add(c); } else if ( (c=x.getNextSibling()) != null ) { m_stack.set(m_stack.size()-1, c); } else { m_stack.remove(m_stack.size()-1); while (!m_stack.isEmpty()) { c = (Node)m_stack.remove(m_stack.size()-1); if ( c == m_root ) { break; } else if ( (c=c.getNextSibling()) != null ) { m_stack.add(c); break; } } } } else { x = (Node)m_stack.remove(m_stack.size()-1); if ( x != m_root && (c=x.getNextSibling()) != null ) { for (; c != null; c=c.getChild(0)) { m_stack.add(c); } } } return x; } /** * Throws an UnsupportedOperationException * @see java.util.Iterator#remove() */ public void remove() { throw new UnsupportedOperationException("Remove not supported"); } } // end of class TreeNodeIterator