The structures package doesn't actually include an interface for binary trees (it just contains one class BinaryTree), but here is what it would look like if it existed:
public interface BinaryTreeInterface {
public void clear();
// post: removes all nodes from tree
public void insert(Object value);
// pre: cursor is invalid
// post: if tree empty, value is inserted at root, o'wise
// value inserted where cursor last moved off tree
public Object remove();
// pre: cursor is valid and has no children
// post: leaf removed, cursor is moved to parent, if any
public Object value();
// pre: cursor valid
// post: returns value of object at cursor
public void setValue(Object value);
// pre: cursor valid
// post: sets value found at cursor
public void reset();
// post: moves the cursor to the root, if any
public boolean valid();
// post: returns true if cursor points to a valid node.
public boolean hasLeft();
// post: returns true iff cursor has left child
public boolean hasRight();
// post: returns true iff cursor has right child
public boolean hasParent();
// pre: cursor is valid
// post: returns true iff cursor has parent
public boolean isLeftChild();
// post: return true if cursor has parent & is left child
public boolean isRightChild();
// post: return true if cursor has parent & is rt child
public void moveLeft();
// pre: cursor is valid
// post: cursor moves to left child of pre-cursor,
// or off tree
public void moveRight();
// pre: cursor is valid
// post: cursor moves to right child of pre-cursor,
// or off tree
public void moveUp();
// pre: cursor is valid
// post: cursor moves up to parent of pre-cursor
public int height();
// post: returns height of cursor in tree
// or -1 if tree is empty
public int depth();
// post: returns depth of cursor in tree
// or -1 if tree is empty
public boolean isFull();
// post: return true iff subtree rooted at cursor is full
public boolean isComplete();
// post: returns true iff subtree rooted at cursor is
// complete
public boolean isEmpty();
// post: returns true iff tree is emtpy
public int size();
// post: returns number of nodes in tree
public Iterator elements();
// post: returns inorder traversal of tree
public Iterator inorderElements();
// post: returns inorder traversal of tree
public Iterator preorderElements();
// post: returns preorder traversal of tree
public Iterator postorderElements();
// post: returns postorder traversal of tree
public String toString();
// post: returns string representation of tree
}
public class BinaryTreeNode
{
protected Object val;
protected BinaryTreeNode parent;
protected BinaryTreeNode left;
protected BinaryTreeNode right;
public BinaryTreeNode(Object value,
BinaryTreeNode left,
BinaryTreeNode right)
// post:
returns a node referencing value & subtrees
{
val = value;
setLeft(left);
setRight(right);
}
public BinaryTreeNode left()
// post:
returns reference to left subtree, or null
public BinaryTreeNode right()
// post:
returns reference to right subtree, or null
public BinaryTreeNode parent()
// post:
returns reference to parent node, or null
public void setLeft(BinaryTreeNode
newLeft)
// post:
sets left subtree to newLeft
//
reparents newLeft if not null
{
if (left != null &&
(left.parent() == this)) left.setParent(null);
left = newLeft;
if (left != null) left.setParent(this);
}
public void setRight(BinaryTreeNode newRight)
protected void setParent(BinaryTreeNode
newParent)
// post:
reparents this node to parent reference, or null
public static int size(BinaryTreeNode
n)
// post:
returns the size of the subtree rooted at n
public static BinaryTreeNode root(BinaryTreeNode
n)
// post:
returns the root of the tree containing node n
{
if ((n == null) || (n.parent() == null)) return n;
else return root(n.parent());
}
public static int height(BinaryTreeNode
n)
// post:
returns the height of a node n in its tree
{
if (n == null) return -1;
return Math.max(height(n.left()),height(n.right()));
}
public static int depth(BinaryTreeNode
n)
// post:
returns the depth of a node in the tree
{
if (n == null) return -1;
return 1 + depth(n.parent());
}
...
public boolean isLeftChild()
// post:
returns true if this is a left child of parent.
{
if (parent() == null) return false;
return this == parent().left();
}
public Object value()
// post:
returns value associated with this node.
public void setValue(Object value)
// post:
sets the value associated with this node
}
Notes. 1. Must be careful in setting element to left or right (must connect both ways) - extra test at beginning setting parent field of elt currently there to null isn't strictly necessary.
2. Root, height, and depth are all recursive (and are all static - i.e., belong with class, not object!).