// File: tree.h
//
// A binary tree class


#ifndef _tree_h
#define _tree_h

#include <stdlib.h>
#include <exception.h>

// Exception handling class. Object of this type is thrown when  
// memory allocation fails
//

class MemoryError {
   // no members
} ;


// TYPE must support assignment and <<
// TYPE must have a copy constructor

template <class TYPE>
class Tree ;


template <class TYPE>
class TreeNode {
friend class Tree<TYPE> ;

public:

   TYPE data ;
   Tree<TYPE> left ;
   Tree<TYPE> right ;

   void *operator new(size_t) ;
   void operator delete(void *) ;

protected:

   TreeNode() {} 
   TreeNode(const TYPE& t) : data(t) {} 

} ;


template <class TYPE>
class Tree {

public:

   Tree() ;
   Tree(const TYPE&) ;
   Tree(const TYPE&, const Tree&, const Tree&) ;

   ~Tree() ;

   void *operator new(size_t) ;
   void operator delete(void *) ;

   void inorder() ;
   void preorder() ;
   void postorder() ;

   TreeNode<TYPE> *root ;
   
} ;

#endif
