Tree ADT

  • Differentiate general (rooted) tree from a binary tree
  • Recognize "Array of References" and "Leftmost-Child–Right-Sibling" representations of a general tree.

A general (or unrestricted) tree is one where each node has an unlimited number of children nodes.

A Tree ADT to represent a general tree may look like this:

public interface Tree<T> extends Iterable<T> {
  int size();
  boolean empty();
  Position<T> insertRoot(T t) throws InsertionException;
  boolean root(Position<T> p) throws PositionException;
  Position<T> root() throws EmptyException;
  Position<T> insertChild(Position<T> p, T t) throws PositionException;
  boolean leaf(Position<T> p) throws PositionException;
  Position<T> parent(Position<T> p) throws PositionException;
  T remove(Position<T> p) throws PositionException, RemovalException;
  Iterator<T> iterator();
  Iterable<Position<T>> children(Position<T> p) throws PositionException;
}

A Tree ADT has utility in any application that requires hierarchical representation of data:

  • File directories
  • Inheritance hierarchy
  • Website page structure
  • Book outline
  • Etc

The Tree ADT can be implemented using a linked structure such as the one we have used to represent the binary search tree. The static nested Node class can be updated according to the following tree representations:

  1. Array of References Representation
private static class Node<T> {
  T data;
  ArrayList<Node<T>> children;
}
  1. Leftmost-Child–Right-Sibling Representation
private static class Node<T> {
  T data;
  Node<T> child;
  Node<T> sibling;
}