#include "bintree.hpp"
template <class type>
type max(type one, type two)
{
	if(one > two) return one;
	return two;
}

template <class type>
int bintree<type>::size()
{
	if(!root) return 0;
	return 1+root->left->size()+root->right->size();
}

template <class type>
int bintree<type>::height()
{
	if(!root) return -1;
	return 1+max(root->left->height(),root->right->height());
}

template <class type>
bintree<type> bintree<type>::operator=(const bintree<type> &old)
{
	if(old.root)
	{
		root = new bnode<type>;
		root->item = old.root->item;
		*(root->left)=*(old.root->left);
		*(root->right)=*(old.root->right);
	}
	return *this;
}

template <class type>
void bintree<type>::traverse(mode_type mode, void (*visit)(type item))
{
	if(mode == preorder)
	{
		if(root)
		{
			(*visit)(root->item);
			root->left->traverse(mode,visit);
			root->right->traverse(mode,visit);
		}
		return;
	}
	if(mode == inorder)
	{
		if(root)
		{
			root->left->traverse(mode,visit);
			(*visit)(root->item);
			root->right->traverse(mode,visit);
		}
		return;
	}
}

template <class type>
bintree<type>::~bintree()
{
	if(root)
	{
		cerr << "Destroying " << root->item << endl;
		delete root;
	}
}


