/**
 * An interface for a tree where nodes can have an arbitrary number of children.
 */
public interface Tree {
  /** Returns the number of nodes in the tree. */
  public int size();
  /** Returns whether the tree is empty. */
  public boolean isEmpty();
  /** Return an iterator of the elements stored in the tree. */
  public Iterator elements();
  /** Returns an iterator of the nodes stored in the tree. */
  public Iterator positions();
  /** Replaces the element stored at a given node. */
  public Object replace(Position v, Object e)
    throws InvalidPositionException;
  /** Returns the root of the tree. */
  public Position root() throws EmptyTreeException;
  /** Returns the parent of a given node. */
  public Position parent(Position v)
    throws InvalidPositionException, BoundaryViolationException;
  /** Returns an iterator of the children of a given node. */
  public Iterator children(Position v) 
    throws InvalidPositionException;
  /** Returns whether a given node is internal. */
  public boolean isInternal(Position v) 
    throws InvalidPositionException;
  /** Returns whether a given node is external. */
  public boolean isExternal(Position v) 
    throws InvalidPositionException;
  /** Returns whether a given node is the root of the tree. */
  public boolean isRoot(Position v)
    throws InvalidPositionException;
}