#include <iostream>
#include "BinaryTree.cpp"

using namespace std;

#ifndef TREETRAVERSAL_CLASS_INCLUDED
#define TREETRAVERSAL_CLASS_INCLUDED

/*
	TreeTraversal Class
	LastModification : 2008. 5. 5
	Version : 0.9.0
	myllyj(myllyj at myllyj dot com) / http://program.myllyj.com

	Requirements:
		include BinaryTree class.

	Comment:
		BinaryTree¿¡¼­ °¡´ÉÇÑ InOrder¸¦
		Æ÷ÇÔÇØ PostOrder, PreOrderÀÌ ±¸ÇöµÇ¾î ÀÖ´Ù.

		Tree¿¡¼­ ¿ª½Ã ±¸Çö °¡´ÉÇÑ PostOrder°ú PreOrderÀº
		ÀÌ Class¿¡´Â ÇöÀç ±¸ÇöÇÒ ¿¹Á¤ÀÌ´Ù. (¹Ì±¸Çö »óÅÂ)
*/

template <class T>
class TreeTraversal
{
public:
	void PreOrder(BinaryTree<T> *tree);
	void InOrder(BinaryTree<T> *tree);
	void PostOrder(BinaryTree<T> *tree);
};

template <class T>
void TreeTraversal<T>::PreOrder(BinaryTree<T> *tree)
{
	if (tree == NULL) return;

	cout << tree->GetData() << " ";
	PreOrder(tree->GetLeftChild());
	PreOrder(tree->GetRightChild());

}

template <class T>
void TreeTraversal<T>::InOrder(BinaryTree<T> *tree)
{
	if (tree == NULL) return;

	InOrder(tree->GetLeftChild());
	cout << tree->GetData() << " ";
	InOrder(tree->GetRightChild());
}

template <class T>
void TreeTraversal<T>::PostOrder(BinaryTree<T> *tree)
{
	if (tree == NULL) return;

	PostOrder(tree->GetLeftChild());
	PostOrder(tree->GetRightChild());
	cout << tree->GetData() << " ";
}

#endif
