Advertisement
Guest User

Untitled

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