public class BinaryTree {

    private Subtree root = null;

    public BinaryTree() { }

    public BinaryTree(int value) {
	root = new Subtree(value);
    }
    
   /**
    * insert a new node with 
    * a given key and eliminate duplicates
    * @param value - the value of the key to insert
    */
    public void insert(int value) {

    }

    /**
     * lookup a Subtree with a given key
     * @param value - the value of the Subtree to lookup
     */
    public Subtree lookup(int value) {
    }

    /**
     * print an ordered sequence
     * of the keys stored in the tree
     */
    public void printOrdered() {
    }
    
    /**
     * print the structure of the tree
     */
    public void printStructure() {
    }

    private Subtree lookup(int value, Subtree x) {
    }
    
    private void printOrdered(Subtree x) {
    }
    
    private void printStructure(Subtree a) {
    }

    public static void main(String[] args) {
	BinaryTree myTree = new BinaryTree();
	myTree.insert(2);
	myTree.insert(1);
	myTree.insert(4);
	myTree.insert(0);
	myTree.insert(3);
	myTree.printStructure();
    }


    /**
     * private helper class which is a single node
     * represented trough an integer key,
     * a parent, left and right subtree pointer.
     */
    private class Subtree {
	private int value;
	private Subtree parent;
	private Subtree left;
	private Subtree right;

	public Subtree(int value) { value(value); }

	public int  value() { return value; }
	public void value(int value) { this.value = value; }

	public Subtree parent() { return parent; }
	public void parent(Subtree parent) { this.parent = parent; }

	public Subtree left() { return left; }
	public void left(Subtree left) { this.left = left; }

	public Subtree right() { return right; }
	public void right(Subtree right) { this.right = right; }

    }

}
