#pragma once
#ifndef CSortedBinaryTree_h
#define CSortedBinaryTree_h
#include "ASyncronizationClass.h"
#include "FWCoreDLLImportExportDeclaration.h"
namespace CoreFW
{
template< typename ClassType >
class DLL_TEMPLATE_DECLARATION_SPECIFIER CBinaryTreeNode
{
public:
CBinaryTreeNode() ;
CBinaryTreeNode( ClassType *pDataObject ) ;
virtual ~CBinaryTreeNode() ;
public:
ClassType *m_pDataObject ;
CBinaryTreeNode *m_pLeftChildNode ;
CBinaryTreeNode *m_pRightChildNode ;
} ;
template< typename ClassType >
class CPreOrderBinaryTreeIterator ;
template< typename ClassType >
class CInOrderBinaryTreeIterator ;
template< typename ClassType >
class CPostOrderBinaryTreeIterator ;
template< typename ClassType >
class DLL_TEMPLATE_DECLARATION_SPECIFIER CSortedBinaryTree
{
friend class CPreOrderBinaryTreeIterator<ClassType> ;
friend class CInOrderBinaryTreeIterator<ClassType> ;
friend class CPostOrderBinaryTreeIterator<ClassType> ;
public:
CSortedBinaryTree() ;
virtual ~CSortedBinaryTree() ;
bool Insert( ClassType *pDataObject ) ;
void Print() ;
int Size() ;
bool IsEmpty() ;
bool Find( ClassType *pDataObject ) ;
ClassType* Minimum() ;
ClassType* Maximum() ;
bool Remove( ClassType *pDataObject ) ;
void RemoveAll() ;
private:
CBinaryTreeNode<ClassType>* CreateNode( ClassType *pDataObject ) ;
bool InsertNode( CBinaryTreeNode<ClassType> **ppSubTreeRootNode,
CBinaryTreeNode<ClassType> *pNewBinaryTreeNode ) ;
void PreOrderPrint( CBinaryTreeNode<ClassType> *pSubTreeRootNode ) ;
void PostOrderPrint( CBinaryTreeNode<ClassType> *pSubTreeRootNode ) ;
void InOrderPrint( CBinaryTreeNode<ClassType> *pSubTreeRootNode ) ;
int GetSize( CBinaryTreeNode<ClassType> *pSubTreeRootNode ) ;
bool IsEmpty( CBinaryTreeNode<ClassType> *pSubTreeRootNode ) ;
CBinaryTreeNode<ClassType>* FindNode( CBinaryTreeNode<ClassType> *pSubTreeRootNode,
CBinaryTreeNode<ClassType> *pSubTreeParentNode,
ClassType *pDataObject,
CBinaryTreeNode<ClassType> **ppBTParentNode ) ;
CBinaryTreeNode<ClassType>* MinimumNode( CBinaryTreeNode<ClassType> *pSubTreeRootNode,
CBinaryTreeNode<ClassType> *pSubTreeParentNode,
CBinaryTreeNode<ClassType> **ppBTParentNode ) ;
CBinaryTreeNode<ClassType>* MaximumNode( CBinaryTreeNode<ClassType> *pSubTreeRootNode,
CBinaryTreeNode<ClassType> *pSubTreeParentNode,
CBinaryTreeNode<ClassType> **ppBTParentNode ) ;
bool DeleteNode( ClassType *pDataObject ) ;
bool RemoveNodeLink( CBinaryTreeNode<ClassType> *pBTNodeToDelete,
CBinaryTreeNode<ClassType> *pBTParentNode ) ;
private:
CBinaryTreeNode<ClassType> *m_pRootNode ;
ASyncronizationClass *m_pBinaryTreeSyncObject ;
} ;
} // End Namespace
#if defined( DLL_TEMPLATE_DECLARATION_SPECIFIER_EXPORT )
#include "CSortedBinaryTree.cpp"
#endif
#endif