// node.cpp
#include "node.h"

template<class type>
node<type>::node(type someitem,node<type> *l,node<type> *r)
{
	item = someitem;
	lptr = l;
	rptr = r;
}

template<class type>
void node<type>::append_left(type someitem)
{
	lptr = new node<type>(someitem,0,0);
}

template<class type>
void node<type>::append_right(type someitem)
{
	rptr = new node<type>(someitem,0,0);
}

template<class type>
void node<type>::store(type someitem)
{
	item = someitem;
}

template<class type>
type node<type>::data()
{
	return item;
}

template<class type>
node<type> node<type>::*left_child()
{
	return lptr;
}

template<class type>
node<type> node<type>::*right_child()
{
	return rptr;
}

template<class type>
bool node<type>::is_leaf()
{
	return (lptr == 0 && rptr == 0);
}

template<class type>
void node<type>::delete_leaf()
{
	// not used
}

template<class type>
void node<type>::inorder_traverse(void (*visit) (type))
{
	if (lptr) lptr->inorder_traverse(visit);
	(*visit)(item);
	if (rptr) rptr->inorder_traverse(visit);
}

template<class type>
void node<type>::preorder_traverse(void (*visit) (type))
{
	(*visit)(item);
	if (lptr) lptr->preorder_traverse(visit);
	if (rptr) rptr->preorder_traverse(visit);
}

template<class type>
void node<type>::postorder_traverse(void (*visit) (type))
{
	if (lptr) lptr->postorder_traverse(visit);
	if (rptr) rptr->postorder_traverse(visit);
	(*visit)(item);
}

