Advertisement
Guest User

C++ Template class BST

a guest
May 11th, 2012
293
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.87 KB | None | 0 0
  1. #include "Debug.hpp"
  2.  
  3. namespace esc
  4. {
  5.     template < typename TComparable, typename TValue >
  6.     SearchTree< TComparable, TValue >::SearchTree( void )
  7.         : mNodeCount( 0 ),
  8.           mRoot( NULL )
  9.     {}
  10.  
  11.     template < typename TComparable, typename TValue >
  12.     SearchTree< TComparable, TValue >::~SearchTree( void )
  13.     {
  14.         if ( mRoot ) delete mRoot;
  15.     }
  16.  
  17.     template < typename TComparable, typename TValue >
  18.     TValue SearchTree< TComparable, TValue >::find( const TComparable& k )
  19.     {
  20.         if ( !mRoot )
  21.         {
  22.             Debug::Log::info( "Tree empty, called from SearchTree::find( const TComparable& k ). Bailing out." );
  23.             return;
  24.         }
  25.  
  26.         Node* traverser = mRoot;
  27.  
  28.         while( traverser != NULL )
  29.         {
  30.             if ( k < traverser->Key )
  31.             {
  32.                 if ( traverser->mLeftChild )
  33.                 {
  34.                     traverser = traverser->mLeftChild;
  35.                     continue;
  36.                 }
  37.                 else
  38.                 {
  39.                     return false; //node doesn't exist
  40.                 }
  41.             }
  42.             else if ( k > traverser->Key )
  43.             {
  44.                 if( traverser->mRightChild )
  45.                 {
  46.                     traverser = traverser->mRightChild;
  47.                     continue;
  48.                 }
  49.                 else
  50.                 {
  51.                     return false; //node doesn't exist
  52.                 }
  53.             }
  54.             else // nodes are equal
  55.             {
  56.                 return *( traverser->Value );
  57.             }
  58.         }
  59.     }
  60.  
  61.     template < typename TComparable, typename TValue >
  62.     void SearchTree< TComparable, TValue >::insert( const TComparable& k, const TValue& v )
  63.     {
  64.         if ( !mRoot )
  65.         {
  66.             mRoot = new Node;
  67.             mRoot->Key = k;
  68.             mRoot->Value = v;
  69.  
  70.             return;
  71.         }
  72.  
  73.         Node* traverser = mRoot;
  74.  
  75.         while( traverser != NULL )
  76.         {
  77.             if ( k < traverser->Key )
  78.             {
  79.                 if ( traverser->mLeftChild )
  80.                 {
  81.                     traverser = traverser->mLeftChild;
  82.                
  83.                     continue;
  84.                 }
  85.  
  86.                 //left child doesn't exist, thus, create it: we have found our new position.
  87.  
  88.                 traverser->mLeftChild = new Node;
  89.                 traverser->mLeftChild->Key = k;
  90.                 traverser->mLeftChild->Value = v;
  91.             }
  92.             else if ( k > traverser->Key )
  93.             {
  94.                 if( traverser->mRightChild )
  95.                 {
  96.                     traverser = traverser->mRightChild;
  97.  
  98.                     continue;
  99.                 }
  100.  
  101.                 //right child doesn't exist, thus, create it: we have found our new position.
  102.  
  103.                 traverser->mRightChild = new Node;
  104.                 traverser->mRightChild->Key = k;
  105.                 traverser->mLeftChild->Value = v;
  106.             }
  107.             else //is equal to
  108.             {
  109.                 return;
  110.             }
  111.         }
  112.     }
  113.  
  114.     template < typename TComparable, typename TValue >
  115.     void SearchTree< TComparable, TValue >::insert( const Iterator& pIter )
  116.     {
  117.        
  118.     }
  119.  
  120.     template < typename TComparable, typename TValue >
  121.     typename SearchTree< TComparable, TValue >::Iterator SearchTree< TComparable, TValue >::begin( TreeIterator::IteratorFocus f ) const
  122.     {
  123.         typename SearchTree< TComparable, TValue >::Iterator ret( 0, f );
  124.         return ret;
  125.     }
  126.  
  127.     template < typename TComparable, typename TValue >
  128.     typename SearchTree< TComparable, TValue >::Iterator SearchTree< TComparable, TValue >::end( TreeIterator::IteratorFocus f ) const
  129.     {
  130.         return typename SearchTree< TComparable, TValue >::Iterator( mNodeCount, f );
  131.     }
  132.  
  133.     /************************/
  134.     /* SearchTree::Iterator */
  135.     /************************/
  136.  
  137.     template < typename TComparable, typename TValue >
  138.     SearchTree< TComparable, TValue >::Iterator::Iterator( void )
  139.         : mIterPosition( 0 ),
  140.           mCurrentNode( NULL ),
  141.           mFocus( Leftmost ),
  142.     {}
  143.  
  144.     template < typename TComparable, typename TValue >
  145.     SearchTree< TComparable, TValue >::Iterator::Iterator( int32_t position, IteratorFocus focus )
  146.         : mIterPosition( position ),
  147.           mCurrentNode( NULL ),
  148.           mFocus( focus )
  149.     {}
  150.  
  151.     template < typename TComparable, typename TValue >
  152.     SearchTree< TComparable, TValue >::Iterator::~Iterator( void )
  153.     {}
  154.  
  155.     template < typename TComparable, typename TValue >
  156.     bool SearchTree< TComparable, TValue >::Iterator::isLeafNode( const Node*& n )
  157.     {
  158.         return ( n->mLeftChild == NULL && n->mRightChild == NULL );
  159.     }
  160.  
  161.     template < typename TComparable, typename TValue >
  162.     bool SearchTree< TComparable, TValue >::Iterator::isInternalNode( const Node*& n )
  163.     {
  164.         return ( n->mLeftChild != NULL && n->mRightChild != NULL );
  165.     }
  166.  
  167.     template < typename TComparable, typename TValue >
  168.     int32_t SearchTree< TComparable, TValue >::Iterator::operator++( void )
  169.     {
  170.         static int32_t numStepsLeft = 0;
  171.         static int32_t numStepsRight = 0;
  172.        
  173.         if ( numStepsLeft != numStepsRight )
  174.         {
  175.             if ( numStepsLeft > numStepsRight )
  176.             {
  177.                 mCurrentNode = mCurrentNode->mRightChild;
  178.                 ++numStepsRight;
  179.             }
  180.             else
  181.             {
  182.                 mCurrentNode = mCurrentNode->mLeftChild;
  183.                 ++numStepsLeft;
  184.             }
  185.         }
  186.         else
  187.         {
  188.             switch ( mFocus )
  189.             {
  190.             case Rightmost:
  191.                 mCurrentNode = mCurrentNode->mRightChild;
  192.                 break;
  193.             case Leftmost:
  194.                 mCurrentNode = mCurrentNode->mLeftChild;
  195.                 break;
  196.             }
  197.         }
  198.  
  199.  
  200.         return ++mIterPosition;
  201.     }
  202.  
  203.     template < typename TComparable, typename TValue >
  204.     bool SearchTree< TComparable, TValue >::Iterator::operator==( const Iterator& pIter )
  205.     {
  206.         return ( pIter.getCurrent() == mCurrentNode ) && ( pIter.getPosition() == mIterPosition );
  207.     }
  208.  
  209.     template < typename TComparable, typename TValue >
  210.     bool SearchTree< TComparable, TValue >::Iterator::operator!=( const Iterator& pIter )
  211.     {
  212.         return ( pIter.getCurrent() != mCurrentNode ) && ( pIter.getPosition() != mIterPosition );
  213.     }
  214.  
  215.     template < typename TComparable, typename TValue >
  216.     bool SearchTree< TComparable, TValue >::Iterator::inOrderTraverse( Node* n )
  217.     {
  218.         if ( n != NULL && isInternalNode( n ) )
  219.         {
  220.             inOrderTraverse( n->mLeftChild );
  221.             inOrderTraverse( n->mRightChild );
  222.         }
  223.     }
  224.  
  225.     template < typename TComparable, typename TValue >
  226.     TValue SearchTree< TComparable, TValue >::Iterator::treeSearch( Node* n, const TComparable& k )
  227.     {
  228.         if ( n != NULL )
  229.         {
  230.             if ( n == NULL )
  231.             {
  232.                 return NULL;
  233.             }
  234.             else if ( k == n->Key )
  235.             {
  236.                 return n->Value;
  237.             }
  238.             else if ( k < n->Key )
  239.             {
  240.                 return treeSearch( n->mLeftChild, k );
  241.             }
  242.             else
  243.             {
  244.                 return treeSearch( n->mRightChild, k );
  245.             }
  246.         }
  247.     }
  248.  
  249.  
  250.  
  251.    
  252. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement