Package prefuse.data.util

Source Code of prefuse.data.util.TreeNodeIterator

/**
* 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
TOP

Related Classes of prefuse.data.util.TreeNodeIterator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.