/** Adds a root node to an empty tree */ public Position addRoot(Object e) throws NonEmptyTreeException { if(!isEmpty()) throw new NonEmptyTreeException("Tree already has a root"); size = 1; root = createNode(e,null,null,null); return root; } /** Attaches two trees to be subtrees of an external node. */ public void attach(Position v, BinaryTree T1, BinaryTree T2) throws InvalidPositionException { if (isInternal(v)) throw new InvalidPositionException("Cannot attach from internal node"); BTPosition vv = (BTPosition)v; if (!T1.isEmpty()) { vv.setLeft((BTPosition) T1.root()); ((BTPosition)T1.root()).setParent(vv); // T1 should be invalidated } if (!T2.isEmpty()) { vv.setRight((BTPosition) T2.root()); ((BTPosition)T2.root()).setParent(vv); // T2 should be invalidated } } /** If v is a good binary tree node, cast to BTPosition, else throw exception */ protected BTPosition checkPosition(Position v) throws InvalidPositionException { if (v == null || !(v instanceof BTPosition)) throw new InvalidPositionException("The position is invalid"); return (BTPosition) v; } /** Creates a new binary tree node */ protected BTPosition createNode(Object element, BTPosition parent, BTPosition left, BTPosition right) { return new BTNode(element,parent,left,right); } /** Creates a list storing the the nodes in the subtree of a node, * ordered according to the inorder traversal of the subtree. */ protected void inorderPositions(Position v, List pos) throws InvalidPositionException { if (hasLeft(v)) inorderPositions(left(v), pos); // recurse on left child pos.insertLast(v); if (hasRight(v)) inorderPositions(right(v), pos); // recurse on right child }