#include <iostream>
#include <iomanip>
#include <assert.h>
using namespace std;
//class TreeNode
template<class NODETYPE> class MyTree;//forward declare
template<class NODETYPE>
class TreeNode
{
friend class MyTree< NODETYPE>;
public:
TreeNode( const NODETYPE & );
NODETYPE getData()const;
private:
TreeNode< NODETYPE>* leftPtr;
NODETYPE data;
TreeNode< NODETYPE>* rightPtr;
};
template<class NODETYPE>
TreeNode<NODETYPE >::TreeNode(const NODETYPE& d) : leftPtr(0),data(d),rightPtr(0)
{
}
template<class NODETYPE>
NODETYPE TreeNode< NODETYPE>::getData() const
{
return data;
}
///
//class MyTree
///
template<class NODETYPE>
class MyTree
{
public:
MyTree();
void insertNode( const NODETYPE& );
void preOrderTraversal()const; //前序遍历
void inOrderTraversal()const;//中序遍历
void postOrderTraversal()const;//后序遍历
private:
TreeNode< NODETYPE>* rootPtr;
//utility
void insertNodeHelper(TreeNode< NODETYPE>** , const NODETYPE&);
void preOrderHelper(TreeNode< NODETYPE>* ) const;
void inOrderHelper(TreeNode< NODETYPE>* ) const;
void postOrderHelper(TreeNode< NODETYPE>* ) const;
};
template<class NODETYPE>
MyTree<NODETYPE >::MyTree(): rootPtr(0)
{
}
template<class NODETYPE>
void MyTree< NODETYPE>::insertNode( constNODETYPE & d)
{
insertNodeHelper( &rootPtr,d );
}
template<class NODETYPE>
void MyTree< NODETYPE>::preOrderTraversal() const
{
preOrderHelper( rootPtr);
}
template<class NODETYPE>
void MyTree< NODETYPE>::inOrderTraversal() const
{
inOrderHelper( rootPtr);
}
template<class NODETYPE>
void MyTree< NODETYPE>::postOrderTraversal() const
{
postOrderHelper( rootPtr);
}
template<class NODETYPE>
void MyTree< NODETYPE>::insertNodeHelper( TreeNode< NODETYPE>** ptr, constNODETYPE & d)
{
if( *ptr == 0 ) //root node
{
*ptr = new TreeNode< NODETYPE>(d);
assert( (*ptr)!= 0 );
}
else
{
if( ((*ptr)->data) < d )
insertNodeHelper( &(*ptr)->leftPtr, d );
else if( (*ptr)->data> d )
insertNodeHelper( &(*ptr)->rightPtr, d );
else
cout << d<< " dup"<<endl;
}
}
template<class NODETYPE>
void MyTree< NODETYPE>::preOrderHelper( TreeNode< NODETYPE>* ptr) const
{
if( ptr != 0 )
{
cout << ptr->data << "";
preOrderHelper( ptr->leftPtr );
preOrderHelper( ptr->rightPtr );
}
}
template<class NODETYPE>
void MyTree< NODETYPE>::inOrderHelper( TreeNode< NODETYPE >* ptr) const
{
if( ptr != 0 )
{
inOrderHelper( ptr->leftPtr );
cout << ptr->data << "";
inOrderHelper( ptr->rightPtr );
}
}
template<class NODETYPE>
void MyTree< NODETYPE>::postOrderHelper( TreeNode< NODETYPE>* ptr ) const
{
if( ptr != 0 )
{
postOrderHelper( ptr->leftPtr );
postOrderHelper( ptr->rightPtr );
cout << ptr->data << "";
}
}
int main( void )
{
MyTree< int> intTree;
int intVal;
cout << "Enter10 integer numbers:\n";
for( int i = 0; i <10; ++i)
{
cin >> intVal;
intTree.insertNode(intVal );
}
cout << "\npreOrdertraversal:";
intTree.preOrderTraversal();
cout << "\ninOrdertraversal:";
intTree.inOrderTraversal();
cout << "\npostOrdertraversal:";
intTree.postOrderTraversal();
cout << "\n\n";
return 0;
}