Advertisement
Neveles

Untitled

Mar 15th, 2020
275
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.60 KB | None | 0 0
  1. #ifndef __BINARY_SEARCH_TREE_H
  2. #define __BINARY_SEARCH_TREE_H
  3.  
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. template <class T>
  9. class BinarySearchTree
  10. {
  11. private:
  12.  
  13.     struct Node
  14.     {
  15.         T key_;
  16.         Node* left_;
  17.         Node* right_;
  18.         Node* p_;
  19.  
  20.         Node(const T& key, Node* p = nullptr, Node* left = nullptr, Node* right = nullptr) : key_(key), left_(left), right_(right), p_(p) {}
  21.     };
  22.  
  23.     Node* root_;
  24.  
  25. public:
  26.  
  27.     BinarySearchTree() : root_(nullptr) {}
  28.  
  29.     virtual ~BinarySearchTree()
  30.     {
  31.         deleteSubtree(root_);
  32.     }
  33.  
  34.     void print(ostream& out) const
  35.     {
  36.         printNode(out, root_);
  37.         out << endl;
  38.     }
  39.  
  40.     void iterativeInsert(const T& key)
  41.     {
  42.         Node* n = new Node(key);
  43.         Node* ptr;
  44.         Node* ptr1;
  45.  
  46.         n->p_ = n->left_ = n->right_ = 0;
  47.         ptr = root_;
  48.  
  49.         ptr1 = nullptr;
  50.  
  51.         while (ptr != 0)
  52.         {
  53.             ptr1 = ptr;
  54.             if (key < ptr->key_)
  55.             {
  56.                 ptr = ptr->left_;
  57.             }
  58.             else
  59.             {
  60.                 ptr = ptr->right_;
  61.             }
  62.         }
  63.         n->p_ = ptr1;
  64.         if (ptr1 == 0)
  65.         {
  66.             root_ = n;
  67.         }
  68.         else
  69.         {
  70.             if (key < ptr1->key_)
  71.             {
  72.                 ptr1->left_ = n;
  73.             }
  74.             else
  75.             {
  76.                 ptr1->right_ = n;
  77.             }
  78.         }
  79.     }
  80.  
  81.     void recursiveInsert(const T& key)
  82.     {
  83.         recursiveInsert(root_, key);
  84.     }
  85.  
  86.     bool iterativeSearch(const T& key) const
  87.     {
  88.         return (iterativeSearchNode(key) != nullptr);
  89.     }
  90.  
  91.     T getSuccsessor(const T& key)
  92.     {
  93.         Node* x = iterativeSearchNode(key);
  94.         Node* y;
  95.         if (x->right_ != nullptr)
  96.         {
  97.             return searchMin(x)->key_;
  98.         }
  99.         y = x->p_;
  100.         while (y != nullptr && x == y->right_)
  101.         {
  102.             x = y;
  103.             y = y->p_;
  104.         }
  105.         if (y != nullptr)
  106.         {
  107.             return y->key_;
  108.         }
  109.         else
  110.         {
  111.             cout << "nullptr";
  112.             return -1;
  113.         }
  114.     }
  115.  
  116.     int getCount() const
  117.     {
  118.         return getCountSubTree(this->root_);
  119.     }
  120.  
  121.     int getHeight()
  122.     {
  123.         return getHeightSubTree(root_);
  124.     }
  125.  
  126.     void deleteKey(const T& key)
  127.     {
  128.         deleteKey(root_, key);
  129.     }
  130.  
  131.     void inorderWalk() const
  132.     {
  133.         orderWalk(root_);
  134.     }
  135.  
  136. private:
  137.  
  138.     Node* searchMin(Node* x)
  139.     {
  140.         while (x->left_ != nullptr)
  141.         {
  142.             x = x->left_;
  143.         }
  144.         return x;
  145.     }
  146.  
  147.     void printNode(ostream& out, Node* root) const
  148.     {
  149.         out << '(';
  150.         if (root != nullptr)
  151.         {
  152.             out << root->key_;
  153.             printNode(out, root->left_);
  154.             printNode(out, root->right_);
  155.         }
  156.         out << ')';
  157.     }
  158.  
  159.     void recursiveInsert(Node*& node, const T& key)
  160.     {
  161.         if (node == nullptr)
  162.         {
  163.             node = new Node(key);
  164.         }
  165.         else
  166.         {
  167.             if (key < node->key_)
  168.             {
  169.                 recursiveInsert(node->left_, key);
  170.             }
  171.             else
  172.             {
  173.                 recursiveInsert(node->right_, key);
  174.             }
  175.         }
  176.     }
  177.  
  178.     Node* iterativeSearchNode(const T& key) const
  179.     {
  180.         Node* current = root_;
  181.  
  182.         while (true)
  183.         {
  184.             if (current == nullptr)
  185.             {
  186.                 return nullptr;
  187.             }
  188.             if (current->key_ == key)
  189.             {
  190.                 return current;
  191.             }
  192.  
  193.             if (key < current->key_)
  194.             {
  195.                 current = current->left_;
  196.             }
  197.             else
  198.             {
  199.                 current = current->right_;
  200.             }
  201.         }
  202.     }
  203.  
  204.     Node* searchSuccsessor(const T& key)
  205.     {
  206.         Node* x = iterativeSearchNode(key);
  207.         Node* y;
  208.         if (x->right_ != nullptr)
  209.         {
  210.             return searchMin(x);
  211.         }
  212.         y = x->p_;
  213.         while (y != nullptr && x == y->right_)
  214.         {
  215.             x = y;
  216.             y = y->p_;
  217.         }
  218.  
  219.         return y;
  220.     }
  221.  
  222.     int getCountSubTree(Node* node) const
  223.     {
  224.         if (node == nullptr)
  225.         {
  226.             return 0;
  227.         }
  228.         return (1 + getCountSubTree(node->left_) + getCountSubTree(node->right_));
  229.     }
  230.  
  231.     int getHeightSubTree(Node* node)
  232.     {
  233.         if (node == nullptr)
  234.         {
  235.             return 0;
  236.         }
  237.         int left, right;
  238.         if (node->left_ != nullptr)
  239.         {
  240.             left = getHeightSubTree(node->left_);
  241.         }
  242.         else
  243.         {
  244.             left = -1;
  245.         }
  246.         if (node->right_ != nullptr)
  247.         {
  248.             right = getHeightSubTree(node->right_);
  249.         }
  250.         else
  251.         {
  252.             right = -1;
  253.         }
  254.         int max = left > right ? left : right;
  255.         return max + 1;
  256.     }
  257.  
  258.     void deleteSubtree(Node* node)
  259.     {
  260.         if (node == nullptr) return;
  261.  
  262.         deleteSubtree(node->left_);
  263.         deleteSubtree(node->right_);
  264.  
  265.         delete node;
  266.     }
  267.  
  268.     Node* deleteKey(Node* toDelete, const T& key)
  269.     {
  270.         if (toDelete == nullptr)
  271.         {
  272.             return toDelete;
  273.         }
  274.  
  275.         if (key == toDelete->key_)
  276.         {
  277.             Node* current;
  278.             if (toDelete->right_ == nullptr)
  279.             {
  280.                 current = toDelete->left_;
  281.             }
  282.             else
  283.             {
  284.  
  285.                 Node* ptr = toDelete->right_;
  286.                 if (ptr->left_ == nullptr)
  287.                 {
  288.                     ptr->left_ = toDelete->left_;
  289.                     current = ptr;
  290.                 }
  291.                 else
  292.                 {
  293.                     Node* pMin = ptr->left_;
  294.                     while (pMin->left_ != nullptr)
  295.                     {
  296.                         ptr = pMin;
  297.                         pMin = ptr->left_;
  298.                     }
  299.                     ptr->left_ = pMin->right_;
  300.                     pMin->left_ = toDelete->left_;
  301.                     pMin->right_ = toDelete->right_;
  302.                     current = pMin;
  303.                 }
  304.             }
  305.             delete toDelete;
  306.             return current;
  307.         }
  308.         else if (key < toDelete->key_)
  309.         {
  310.             toDelete->left_ = deleteKey(toDelete->left_, key);
  311.         }
  312.         else
  313.         {
  314.             toDelete->right_ = deleteKey(toDelete->right_, key);
  315.         }
  316.  
  317.         return toDelete;
  318.     }
  319.  
  320.     void orderWalk(Node* node) const
  321.     {
  322.         if (node != nullptr)
  323.         {
  324.             orderWalk(node->left_);
  325.             cout << node->key_ << endl;
  326.             orderWalk(node->right_);
  327.         }
  328.     }
  329. };
  330.  
  331. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement