/** Returns the root of the tree. */ public Position root() throws EmptyTreeException { if (root == null) throw new EmptyTreeException("The tree has no root"); return root; } /** Returns the left child of a node. */ public Position left(Position v) throws InvalidPositionException, BoundaryViolationException { if (!hasLeft(v)) throw new BoundaryViolationException("No left child"); return ((BTPosition)v).getLeft(); } /** Returns the right child of a node. */ public Position right(Position v) throws InvalidPositionException, BoundaryViolationException { if (!hasRight(v)) throw new BoundaryViolationException("No right child"); return ((BTPosition)v).getRight(); } /** Returns the parent of a node. */ public Position parent(Position v) throws InvalidPositionException, BoundaryViolationException { if (isRoot(v)) throw new BoundaryViolationException("Root has no parent"); return ((BTPosition)v).getParent(); } /** Returns an iterator of the children of a node. */ public Iterator children(Position v) throws InvalidPositionException { List children = new NodeList(); if (hasLeft(v)) children.insertLast(left(v)); if (hasRight(v)) children.insertLast(right(v)); return children.elements(); } /** Returns an iterator of the tree nodes. */ public Iterator positions() { List positions = new NodeList(); if(size != 0) inorderPositions(root(), positions); // assign positions in inorder return positions.elements(); }