Advertisement
Guest User

Untitled

a guest
Jun 3rd, 2013
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.30 KB | None | 0 0
  1. #include <functional>
  2.  
  3. template <typename TValue, typename TPred = std::less<TValue> >
  4. class BinarySearchTree {
  5.  
  6.     struct TNode {
  7.         TValue value;
  8.         TNode *pLeft;
  9.         TNode *pRight;
  10.     };
  11.  
  12. public:
  13.  
  14.     BinarySearchTree();
  15.     BinarySearchTree(BinarySearchTree<TValue, TPred> const &tree);
  16.     BinarySearchTree<TValue, TPred> &operator=(BinarySearchTree<TValue, TPred> const &tree);
  17.     ~BinarySearchTree();
  18.  
  19.     bool Insert(TValue const &value); // returns false if already contained
  20.  
  21.     template <typename TVisitor> void VisitPreOrder (TVisitor visitor) const;
  22.     template <typename TVisitor> void VisitInOrder  (TVisitor visitor) const;
  23.     template <typename TVisitor> void VisitPostOrder(TVisitor visitor) const;
  24.  
  25. private:
  26.     TNode *pRoot;
  27.  
  28.     TNode * m_MakeNode (TValue Data);
  29.     bool m_Insert(TValue const &value, TNode *& pRoot);
  30.     void m_Flush(TNode * & pRoot);
  31.     template <typename TVisitor> void m_PreOrder (TVisitor visitor, TNode const * const pRoot) const;
  32.     template <typename TVisitor> void m_InOrder  (TVisitor visitor, TNode const * const pRoot) const;
  33.     template <typename TVisitor> void m_PostOrder(TVisitor visitor, TNode const * const pRoot) const;
  34. };
  35.  
  36. // CTor
  37. template <typename TValue, typename TPred>
  38. BinarySearchTree<TValue, TPred>::BinarySearchTree() : pRoot(0) {}
  39.  
  40. template <typename TValue, typename TPred>
  41. BinarySearchTree<TValue, TPred>::BinarySearchTree(BinarySearchTree<TValue, TPred> const &tree) {
  42.     tree.VisitInOrder(Insert);
  43. }
  44.  
  45. template <typename TValue, typename TPred>
  46. BinarySearchTree<TValue, TPred> &BinarySearchTree<TValue, TPred>::operator=(BinarySearchTree<TValue, TPred> const &tree) {
  47.     if (this != &tree) {
  48.         tree.VisitInOrder(Insert);
  49.     }
  50.     return *this;
  51. }
  52.  
  53. // DTor
  54. template <typename TValue, typename TPred>
  55. BinarySearchTree<TValue, TPred>::~BinarySearchTree() {
  56.     m_Flush(pRoot);
  57. }
  58.  
  59. // Member methods
  60. template <typename TValue, typename TPred>
  61. bool BinarySearchTree<TValue, TPred>::Insert(TValue const &value) {
  62.     return m_Insert(value, pRoot);
  63. }
  64.  
  65. template <typename TValue, typename TPred>
  66. template <typename TVisitor>
  67. void BinarySearchTree<TValue, TPred>::VisitPreOrder(TVisitor visitor) const {
  68.     m_PreOrder(visitor, pRoot);
  69. }
  70.  
  71. template <typename TValue, typename TPred>
  72. template <typename TVisitor>
  73. void BinarySearchTree<TValue, TPred>::VisitInOrder(TVisitor visitor) const {
  74.     m_InOrder(visitor, pRoot);
  75. }
  76.  
  77. template <typename TValue, typename TPred>
  78. template <typename TVisitor>
  79. void BinarySearchTree<TValue, TPred>::VisitPostOrder(TVisitor visitor) const {
  80.     m_PostOrder(visitor, pRoot);
  81. }
  82.  
  83. // Private methods
  84. template <typename TValue, typename TPred>
  85. typename BinarySearchTree<TValue, TPred>::TNode * BinarySearchTree<TValue, TPred>::m_MakeNode(TValue Data) {
  86.     TNode * const pNewNode = new TNode;
  87.     pNewNode->value  = Data;
  88.     pNewNode->pLeft  = 0;
  89.     pNewNode->pRight = 0;
  90.     return pNewNode;
  91. }
  92.  
  93. template <typename TValue, typename TPred>
  94. bool BinarySearchTree<TValue, TPred>::m_Insert(TValue const &value, TNode *& pRoot) {
  95.     if (pRoot == 0) {
  96.         pRoot = m_MakeNode(value);
  97.         return true;
  98.     }
  99.     else if (value < pRoot->value) {
  100.         m_Insert(value, pRoot->pLeft);
  101.     }
  102.     else if (value > pRoot->value) {
  103.         m_Insert(value, pRoot->pRight);
  104.     }
  105.     return false;
  106. }
  107.  
  108. template <typename TValue, typename TPred>
  109. void BinarySearchTree<TValue, TPred>::m_Flush(TNode * & pRoot) {
  110.     if (pRoot != 0) {
  111.         m_Flush(pRoot->pLeft);
  112.         m_Flush(pRoot->pRight);
  113.         delete pRoot; pRoot = 0;
  114.     }
  115. }
  116.  
  117. template <typename TValue, typename TPred>
  118. template <typename TVisitor>
  119. void BinarySearchTree<TValue, TPred>::m_PreOrder(TVisitor visitor, TNode const * const pRoot) const {
  120.     if (pRoot != 0) {
  121.         visitor(pRoot->value);
  122.         m_PreOrder(visitor, pRoot->pLeft);
  123.         m_PreOrder(visitor, pRoot->pRight);
  124.     }
  125. }
  126.  
  127. template <typename TValue, typename TPred>
  128. template <typename TVisitor>
  129. void BinarySearchTree<TValue, TPred>::m_InOrder(TVisitor visitor, TNode const * const pRoot) const {
  130.     if (pRoot != 0) {
  131.         m_PreOrder(visitor, pRoot->pLeft);
  132.         visitor(pRoot->value);
  133.         m_PreOrder(visitor, pRoot->pRight);
  134.     }
  135. }
  136.  
  137. template <typename TValue, typename TPred>
  138. template <typename TVisitor>
  139. void BinarySearchTree<TValue, TPred>::m_PostOrder(TVisitor visitor, TNode const * const pRoot) const {
  140.     if (pRoot != 0) {
  141.         m_PreOrder(visitor, pRoot->pLeft);
  142.         m_PreOrder(visitor, pRoot->pRight);
  143.         visitor(pRoot->value);
  144.     }
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement