halfo

BBST Using Map

Jan 20th, 2014
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | None | 0 0
  1. #include <set>
  2. #include <map>
  3. #include <iostream>
  4. #include <cstdlib>
  5. #include <string>
  6.  
  7. using namespace std;
  8.  
  9. template<typename T>
  10. struct Myset{
  11.    private:
  12.    map<T, int> mp;
  13.  
  14.    typedef _Rb_tree_node<pair<const T, int> > _Node;
  15.    
  16.    void fix_size(_Rb_tree_node_base * it, bool step_in = true){
  17.       int & it_size = static_cast<_Node *>(it) -> _M_value_field.second;
  18.       it_size = 1;
  19.       if(it -> _M_left != 0){
  20.          if(step_in)fix_size(it -> _M_left, false);
  21.          it_size += static_cast<_Node *>(it -> _M_left) -> _M_value_field.second;
  22.       }
  23.       if(it -> _M_right != 0){
  24.          if(step_in)fix_size(it -> _M_right, false);
  25.          it_size += static_cast<_Node *>(it -> _M_right) -> _M_value_field.second;
  26.       }
  27.    }
  28.  
  29.    void fix_all_sizes(_Rb_tree_node_base * it, _Rb_tree_node_base * end){
  30.       if(it -> _M_left != 0)fix_size(it -> _M_left);
  31.       if(it -> _M_right != 0)fix_size(it -> _M_right);
  32.       do{
  33.          fix_size(it);
  34.          it = it -> _M_parent;
  35.       }while(it != end);
  36.    }
  37.    
  38.    public:
  39.    void print()const{
  40.       const _Rb_tree_node_base * it = mp.begin()._M_node;
  41.       while(it -> _M_parent != mp.end()._M_node){
  42.          it = it -> _M_parent;
  43.       }
  44.       print_impl(it, "");
  45.    }
  46.    void print_impl(const _Rb_tree_node_base * it, string indent)const{
  47.       if(it == 0){
  48.          cout << indent << "nil (0)" << endl;
  49.          return;
  50.       }
  51.       cout << indent << static_cast<const _Node *>(it) -> _M_value_field.first;
  52.       cout   << " (" << static_cast<const _Node *>(it) -> _M_value_field.second << ")" << endl;
  53.       if(it -> _M_left != 0 || it -> _M_right != 0){
  54.          print_impl(it -> _M_left, indent + "  ");
  55.          print_impl(it -> _M_right, indent + "  ");
  56.       }
  57.    }
  58.  
  59.    void insert(const T & t){
  60.       pair<typename map<T, int>::iterator, bool> fit = mp.insert(pair<T, int>(t, -1));
  61.       if(fit.second == false)return;
  62.       fix_all_sizes(fit.first._M_node, mp.end()._M_node);
  63.    }
  64. };
  65.  
  66. int main(){
  67.    Myset<int> st;
  68.    for(int i = 0; i < 30; ++i)st.insert(rand() % 100);
  69.    st.print();
  70. }
Advertisement
Add Comment
Please, Sign In to add comment