// Justin C. Miller
// University of Wisconsin Oshkosh
// Made for: http://www.geocities.com/neonprimetime.geo/index.html
// Date: 2001
// Borland Builder 4.0
#ifndef BINARYT_H
#define BINARYT_H

typedef enum{left, right} Child ;

// forward references
template  class BinaryTree ;
template  class BST ;

template 
class BNode
{
	friend class BinaryTree ;
	friend class BST ;
	
	protected:
		T data ;
		BNode * prnt ;
		BNode * lchild ;
		BNode * rchild ;
	public:
		BNode() {}
		BNode( const T & elm) : data(elm), prnt(0), lchild(0), rchild(0) {}
};

template < class T>
class BinaryTree
{
	protected:
		BNode * root ;
		int Height ( BNode * t)const ;
		void PreOrder(void (*Visit)(BNode * u), BNode * t) ;
		void InOrder(void (*Visit)(BNode * u), BNode * t) ;
		void PostOrder(void (*Visit)(BNode * u), BNode * t) ;
		static void Output (BNode * p) ;
	public:
		BinaryTree() : root(0) {}
		BinaryTree( const T & elm)
		{
			root = new BNode ;
			root->data = elm ;
			root->prnt = 0 ;
			root->lchild = 0 ;
			root->rchild = 0 ;
		}
		virtual ~BinaryTree() {}
		bool InsertLeaf( const T & elm, BNode * prnt, Child lr) ;
		bool Root( T & elm) ;
		T GetData (BNode * t) ;
		int Height() const { return Height(root) ;}
		bool IsEmpty() const 
		{return ((root) ? false : true) ;}
		void PreOrder(void (*Visit)(BNode * u))
		{PreOrder(Visit, root) ;}
		void InOrder(void (*Visit)(BNode * u))
		{InOrder(Visit, root);}
		void PostOrder(void (*Visit)(BNode * u))
		{PostOrder(Visit, root) ;}
		void InOutput() ;
};

#endif

    Source: geocities.com/neonprimetime.geo/cpp/cpp_SourceCode

               ( geocities.com/neonprimetime.geo/cpp)                   ( geocities.com/neonprimetime.geo)