public class LinkedBinaryTree implements BinaryTree { private Position root; // reference to the root private int size; // number of nodes public LinkedBinaryTree() { root = new BTNode(null,null,null,null); size = 1; } public int size() { return size; } public boolean isEmpty() { return (size==0); } public boolean isInternal(Position v) { return (((BTNode) v).getLeft()!=null && ((BTNode) v).getRight()!=null); } public boolean isExternal(Position v) { return (((BTNode) v).getLeft()==null && ((BTNode) v).getRight()==null); } public boolean isRoot(Position v) { return (v==root()); } public Position root() { return root; } public PositionIterator positions() { Position[] positions = new Position[size()]; inorderPositions(root(), positions, 0); return new ArrayPositionIterator(positions); } public Position leftChild(Position v) { return ((BTNode) v).getLeft(); } public Position rightChild(Position v) { return ((BTNode) v).getRight(); } public Position sibling(Position v) { Position p = parent(v); Position lc = leftChild(p); if (v == lc) return rightChild(p); else return lc; } public Position parent(Position v) { return ((BTNode) v).getParent(); }