Advertisement
Guest User

AVL

a guest
Nov 25th, 2014
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.59 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <fstream>
  5.  
  6. using namespace std;
  7.  
  8. /*
  9. // Definicja typu wêz³ów drzewa AVL
  10. //---------------------------------
  11. struct AVLNode
  12. {
  13.   AVLNode * up, * left, * right;
  14.   int bf;
  15.   string key;
  16. };
  17. */
  18.  
  19. struct Key
  20. {
  21.     string surname, name, adress;
  22.     vector<string> phone;
  23. };
  24.  
  25. bool operator < (const Key &lhs, const Key &rhs)
  26. {
  27.     if(lhs.surname < rhs.surname) return true;
  28.     else if(lhs.surname == rhs.surname && lhs.name < rhs.name ) return true;
  29.     else if(lhs.surname == rhs.surname && lhs.name == rhs.name && lhs.adress < rhs.adress) return true;
  30.     else false;
  31. }
  32. bool operator != (const Key &lhs, const Key &rhs)
  33. {
  34.     if(lhs.surname != rhs.surname) return true;
  35.     return false;
  36. }
  37.  
  38. std::ostream & operator <<( std::ostream & s, const Key & key )
  39. {
  40.     return s << key.surname << '.' << key.name << '.' << key.adress;
  41. }
  42. /*Struktura która przechowuje dane książki telefonicznej*/
  43. struct AVL
  44. {
  45.     AVL *up, *left, *right;
  46.     int bf;
  47.     Key key;
  48. };
  49.  
  50.  
  51. string cr,cl,cp;      // łańcuchy do znaków ramek
  52.  
  53. /* Procedura wypisuje drzewo */
  54. void printBT(string sp, string sn, AVL *v)
  55. {
  56.   string s;
  57.  
  58.   if(v)
  59.   {
  60.     s = sp;
  61.     if(sn == cr) s[s.length() - 2] = ' ';
  62.     printBT(s + cp, cr, v->right);
  63.  
  64.     s = s.substr(0,sp.length()-2);
  65.     cout << s << sn << v->key << ":" << v->bf << endl;
  66.  
  67.     s = sp;
  68.     if(sn == cl) s[s.length() - 2] = ' ';
  69.     printBT(s + cp, cl, v->left);
  70.   }
  71. }
  72.  
  73.  /*Procedura do usuwania drzewa*/
  74. void DFSRelease(AVL * v)
  75. {
  76.   if(v)
  77.   {
  78.     DFSRelease(v->left);   // usuwamy lewe poddrzewo
  79.     DFSRelease(v->right);  // usuwamy prawe poddrzewo
  80.     delete v;              // usuwamy sam wêze³
  81.   }
  82. }
  83.  
  84. /* Rotacja RR */
  85. void RR(AVL *&root, AVL *A)
  86. {
  87.   AVL *B = A->right, *p=A->up;
  88.  
  89.   A->right = B->left;
  90.   if(A->right) A->right->up = A;
  91.  
  92.   B->left = A;
  93.   B->up = p;
  94.   A->up = B;
  95.  
  96.   if(p)
  97.   {
  98.     if(p->left == A) p->left = B; else p->right = B;
  99.   }
  100.   else root = B;
  101.  
  102.   if(B->bf == -1) A->bf = B->bf = 0;
  103.   else
  104.   {
  105.     A->bf = -1; B->bf = 1;
  106.   }
  107. }
  108.  
  109. vector <Key> Read(char *nazwa)
  110. {
  111.     fstream file;
  112.     vector<Key> key;
  113.     file.open(nazwa, std::ios::in | std::ios::out );
  114.         if( file.good() == true )
  115.         {
  116.  
  117.         while( !file.eof() )
  118.         {
  119.             Key tmp;
  120.             file>>tmp.surname;
  121.             file>>tmp.name;
  122.             file>>tmp.adress;
  123.             int qty;
  124.             file>>qty;
  125.             for(qty; qty > 0; qty --)
  126.             {
  127.                 string number;
  128.                 file>>number;
  129.                 tmp.phone.push_back(number);
  130.             }
  131.             key.push_back(tmp);
  132.         }
  133.         file.close();
  134.         }
  135.         else printf("Nie udalo sie otworzyc pliku\n");
  136.         return key;
  137. }
  138.  
  139. /* Rotacja LL */
  140. void LL(AVL *&root, AVL *A)
  141. {
  142.   AVL *B = A->left, *p = A->up;
  143.  
  144.   A->left = B->right;
  145.   if(A->left) A->left->up = A;
  146.  
  147.   B->right = A;
  148.   B->up = p;
  149.   A->up = B;
  150.  
  151.   if(p)
  152.   {
  153.     if(p->left == A) p->left = B; else p->right = B;
  154.   }
  155.   else root = B;
  156.  
  157.   if(B->bf == 1) A->bf = B->bf = 0;
  158.   else
  159.   {
  160.     A->bf = 1; B->bf = -1;
  161.   }
  162. }
  163.  
  164. /* Rotacja RL */
  165. void RL(AVL *& root, AVL *A)
  166. {
  167.   AVL *B = A->right, *C = B->left, *p = A->up;
  168.  
  169.   B->left = C->right;
  170.   if(B->left) B->left->up = B;
  171.  
  172.   A->right = C->left;
  173.   if(A->right) A->right->up = A;
  174.  
  175.   C->left = A;
  176.   C->right = B;
  177.   A->up = B->up = C;
  178.   C->up = p;
  179.  
  180.   if(p)
  181.   {
  182.     if(p->left == A) p->left = C; else p->right = C;
  183.   }
  184.   else root = C;
  185.  
  186.   if(C->bf == -1) A->bf =  1; else A->bf = 0;
  187.   if(C->bf ==  1) B->bf = -1; else B->bf = 0;
  188.  
  189.   C->bf = 0;
  190. }
  191.  
  192. /* Rotacja LR */
  193. void LR(AVL *&root, AVL *A)
  194. {
  195.   AVL *B = A->left, *C = B->right, *p = A->up;
  196.  
  197.   B->right = C->left;
  198.   if(B->right) B->right->up = B;
  199.  
  200.   A->left = C->right;
  201.   if(A->left) A->left->up = A;
  202.  
  203.   C->right = A;
  204.   C->left = B;
  205.   A->up = B->up = C;
  206.   C->up = p;
  207.  
  208.   if(p)
  209.   {
  210.     if(p->left == A) p->left = C; else p->right = C;
  211.   }
  212.   else root = C;
  213.  
  214.   if(C->bf ==  1) A->bf = -1; else A->bf = 0;
  215.   if(C->bf == -1) B->bf =  1; else B->bf = 0;
  216.  
  217.   C->bf = 0;
  218. }
  219.  
  220. /* Wstawianie */
  221. void insertAVL(AVL *& root, Key k)
  222. {
  223.   AVL * w,* p,* r;
  224.   bool t;
  225.  
  226.   w = new AVL;        // tworzymy dynamicznie nowy wezel
  227.   w->left = w->right = w->up = NULL;
  228.   w->key  = k;
  229.   w->bf  = 0;
  230.  
  231.   p = root;              // rozpoczynamy od korzenia
  232.  
  233.   if(!p) root = w;       // jeœli drzewo jest puste, to wêze³ w umieszczamy w korzeniu
  234.   else
  235.   {                      // inaczej szukamy miejsce dla w
  236.     while(true)
  237.       if(k < p->key)     // porównujemy klucze
  238.       {
  239.         if(!p->left)     // jeœli p nie posiada lewego syna, to
  240.         {
  241.           p->left = w;   // lewym synem p staje siê wêze³ w
  242.           break;         // wychodzimy z pêtli
  243.         }
  244.         p = p->left;     // inaczej przechodzimy do lewego syna
  245.       }
  246.       else
  247.       {
  248.         if(!p->right)    // jeœli p nie posiada prawego syna, to
  249.         {
  250.           p->right = w;  // prawym synem staje siê wêze³ w
  251.           break;         // wychodzimy z pêtli
  252.         }
  253.         p = p->right;    // inaczej przechodzimy do prawego syna
  254.       }
  255.  
  256.     w->up = p;           // ojcem w jest p
  257.  
  258.     //---------------------------------
  259.     // FAZA 2 - równowazenie drzewa AVL
  260.     //---------------------------------
  261.  
  262.     if(p->bf) p->bf = 0; // UWAGA NR 1
  263.     else
  264.     {
  265.       if(p->left == w)   // UWAGA NR 2
  266.         p->bf = 1;
  267.       else
  268.         p->bf = -1;
  269.  
  270.       r = p->up;        // bêdziemy szli w górê drzewa w kierunku korzenia
  271.                         // r i p wskazuj¹ ojca i syna na tej œcie¿ce
  272.       t = false;
  273.       while(r)
  274.       {
  275.         if(r->bf)
  276.         {
  277.           t = true;     // ustalamy wynik pêtli
  278.           break;        // przerywamy pêtlê
  279.         };
  280.                         // inaczej modyfikujemy r.bf
  281.         if(r->left == p) r->bf =  1;
  282.         else             r->bf = -1;
  283.  
  284.         p = r;          // przechodzimy w górê na wy¿szy poziom
  285.         r = r->up;
  286.       }
  287.  
  288.       if(t)             // jeœli r.bf = +/- 1, to musimy
  289.       {                 // równowa¿yæ drzewo
  290.         if(r->bf == 1)
  291.         {
  292.           if(r->right == p) r->bf = 0;  // ga³êzie siê równowa¿¹
  293.           else if(p->bf == -1) LR(root,r);
  294.           else                 LL(root,r);
  295.         }
  296.         else
  297.         {              // r.bf = -1
  298.           if(r->left == p) r->bf = 0;  // ga³êzie siê równowa¿¹
  299.           else if(p->bf == 1) RL(root,r);
  300.           else                RR(root,r);
  301.         }
  302.       }
  303.     }
  304.   }
  305. }
  306.  
  307. // Funkcja znajduje poprzednik wêz³a p
  308. //------------------------------------
  309. AVL * predAVL(AVL *p)
  310. {
  311.   AVL *r;
  312.  
  313.   if(p)
  314.   {
  315.     if(p->left)
  316.     {
  317.       p = p->left;
  318.       while(p->right) p = p->right;
  319.     }
  320.     else
  321.       do
  322.       {
  323.         r = p;
  324.         p = p->up;
  325.       } while(p && p->right != r);
  326.   }
  327.   return p;
  328. }
  329.  
  330. // Funkcja szuka w drzewie AVL wêz³a o zadanym kluczu.
  331. // Jeœli go znajdzie, zwraca jego wskazanie. Je¿eli nie,
  332. // to zwraca wskazanie puste.
  333. // Parametrami s¹:
  334. // p - wskazanie korzenia drzewa AVL
  335. // k - klucz poszukiwanego wêz³a
  336. //----------------------------------------------------
  337. AVL *findAVL(AVL *p, Key k)
  338. {
  339.   while(p && p->key != k)
  340.     p = (k < p->key) ? p->left: p->right;
  341.  
  342.   return p;
  343. }
  344.  
  345. // Funkcja usuwa rekurencyjnie wêze³ x
  346. // root - referencja do zmiennej z adresem korzenia
  347. // x - wskazanie usuwanego wêz³a
  348. //-------------------------------------------------
  349. AVL * removeAVL(AVL *& root, AVL *x)
  350. {
  351.   AVL  *t,*y,*z;
  352.   bool nest;
  353.  
  354.   if(x->left && x->right)
  355.   {
  356.     y    = removeAVL(root,predAVL(x));
  357.     nest = false;
  358.   }
  359.   else
  360.   {
  361.     if(x->left)
  362.     {
  363.       y = x->left; x->left = NULL;
  364.     }
  365.     else
  366.     {
  367.       y = x->right; x->right = NULL;
  368.     }
  369.     x->bf = 0;
  370.     nest  = true;
  371.   }
  372.  
  373.   if(y)
  374.   {
  375.     y->up    = x->up;
  376.     y->left  = x->left;  if(y->left)  y->left->up  = y;
  377.     y->right = x->right; if(y->right)  y->right->up = y;
  378.     y->bf    = x->bf;
  379.   }
  380.  
  381.   if(x->up)
  382.   {
  383.     if(x->up->left == x) x->up->left = y; else x->up->right = y;
  384.   }
  385.   else root = y;
  386.  
  387.   if(nest)
  388.   {
  389.     z = y;
  390.     y = x->up;
  391.     while(y)
  392.     {
  393.       if(!y->bf)
  394.       {              // Przypadek nr 1
  395.         if(y->left == z)  y->bf = -1; else y->bf = 1;
  396.         break;
  397.       }
  398.       else
  399.       {
  400.         if(((y->bf == 1) && (y->left == z)) || ((y->bf == -1) && (y->right == z)))
  401.         {           // Przypadek nr 2
  402.           y->bf = 0;
  403.           z = y; y = y->up;
  404.         }
  405.         else
  406.         {
  407.           if(y->left == z)  t = y->right; else t = y->left;
  408.           if(!t->bf)
  409.           {         // Przypadek 3A
  410.             if(y->bf == 1) LL(root,y); else RR(root,y);
  411.             break;
  412.           }
  413.           else if(y->bf == t->bf)
  414.           {         // Przypadek 3B
  415.             if(y->bf == 1) LL(root,y); else RR(root,y);
  416.             z = t; y = t->up;
  417.           }
  418.           else
  419.           {         // Przypadek 3C
  420.             if(y->bf == 1) LR(root,y); else RL(root,y);
  421.             z = y->up; y = z->up;
  422.           }
  423.         }
  424.       }
  425.     }
  426.   }
  427.   return x;
  428. }
  429.  
  430. int main()
  431. {
  432.  
  433.   AVL * root = NULL;
  434.  
  435.  
  436.   // cr = +--
  437.   //      |
  438.  
  439.   // cl = |
  440.   //      +--
  441.  
  442.   // cp = |
  443.   //      |
  444.  
  445.   cr = cl = cp = "  ";
  446.   cr[0] = 218; cr[1] = 196;
  447.   cl[0] = 192; cl[1] = 196;
  448.   cp[0] = 179;
  449.  
  450. vector<Key> keys;
  451. keys=Read("dane.txt");
  452.  
  453. for (int i = 0; i < keys.size(); i++)
  454. {
  455. insertAVL(root, keys[i]);
  456. }
  457.  
  458.  
  459. printBT("","",root);      // Wyświetlamy zawartość drzewa AVL
  460.  
  461.  
  462.   return 0;
  463. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement