Advertisement
Guest User

Untitled

a guest
Dec 7th, 2016
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.38 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. #include <cstdlib>
  5. #include <string>
  6.  
  7. using namespace std;
  8.  
  9. struct Drzewo
  10. {
  11.     string liczba;
  12.     Drzewo *lewy;
  13.     Drzewo *prawy;
  14.     int waga;
  15. };
  16.  
  17. int ilosc_prefiksow = 0; // trzeba zerowaæ przed kazdym uzyciem
  18.  
  19.  
  20. Drzewo *nowyWezel(string liczba)
  21. {
  22.     Drzewo* wezel = new Drzewo;
  23.     wezel->liczba = liczba;
  24.     wezel->lewy = NULL;
  25.     wezel->prawy = NULL;
  26.     wezel->waga = 0;
  27.     return(wezel);
  28. }
  29.  
  30. int wysokosc(Drzewo* wez)
  31. {
  32.     if (wez == NULL) return 0;
  33.     else
  34.     {
  35.         // compute the height of each subtree
  36.         int lheight = wysokosc(wez->lewy);
  37.         int rheight = wysokosc(wez->prawy);
  38.  
  39.         // use the larger one
  40.         if (lheight > rheight) return(lheight + 1);
  41.         else return(rheight + 1);
  42.     }
  43. }
  44.  
  45. Drzewo *rotacjaP(Drzewo *wezel) // ?*
  46. {
  47.     Drzewo *tempL = wezel->lewy;
  48.     Drzewo *tempP = tempL->prawy;
  49.  
  50.     tempL->prawy = wezel;
  51.     wezel->lewy = tempP;
  52.  
  53.     wezel->waga = wysokosc(wezel->lewy) - wysokosc(wezel->prawy);
  54.     tempL->waga = wysokosc(tempL->lewy) - wysokosc(tempL->prawy);
  55.  
  56.     return tempL;
  57. }
  58.  
  59. Drzewo *rotacjaL(Drzewo *wezel)
  60. {
  61.     Drzewo *tempP = wezel->prawy;
  62.     Drzewo *tempL = tempP->lewy;
  63.  
  64.     tempP->lewy = wezel;
  65.     wezel->prawy = tempL;
  66.  
  67.     wezel->waga = wysokosc(wezel->lewy) - wysokosc(wezel->prawy);
  68.     tempP->waga = wysokosc(tempP->lewy) - wysokosc(tempP->prawy);
  69.  
  70.     return tempP;
  71. }
  72.  
  73. Drzewo *dodaj(Drzewo* wezel, string l)
  74. {
  75.     if (wezel == NULL) return(nowyWezel(l));
  76.  
  77.     else if (l < wezel -> liczba)
  78.         wezel->lewy = dodaj(wezel->lewy, l);
  79.  
  80.     else if (l > wezel -> liczba )
  81.         wezel->prawy = dodaj(wezel->prawy, l);
  82.  
  83.     else return wezel;
  84.  
  85.     wezel -> waga = wysokosc(wezel -> lewy) - wysokosc(wezel -> prawy);
  86.  
  87.     // RR
  88.     if (wezel -> waga > 1 && (l < wezel -> lewy -> liczba))
  89.     {
  90.         return rotacjaP(wezel);
  91.     }
  92.  
  93.     // LL
  94.     if (wezel->waga < -1 && (l > wezel -> liczba ))
  95.     {
  96.         return rotacjaL(wezel);
  97.     }
  98.  
  99.     // Left Right Case
  100.     if (wezel->waga > 1 && (l > wezel -> liczba))
  101.     {
  102.         wezel->lewy = rotacjaL(wezel->lewy);
  103.         return rotacjaP(wezel);
  104.     }
  105.  
  106.     // Right Left Case
  107.     if (wezel->waga < -1 && (l < wezel -> lewy -> liczba))
  108.     {
  109.         wezel->prawy = rotacjaP(wezel->prawy);
  110.         return rotacjaL(wezel);
  111.     }
  112.  
  113.     return wezel;
  114. }
  115.  
  116.  
  117. Drzewo* usun(Drzewo* wezel, string liczba)
  118. {
  119.     bool znaleziony = false;
  120.  
  121.     Drzewo* curr;
  122.     Drzewo* parent = 0;
  123.     curr = wezel;
  124.     while (curr != NULL)
  125.     {
  126.         if (curr -> liczba == liczba) // =
  127.         {
  128.             znaleziony = true;
  129.             break;
  130.         }
  131.         else
  132.         {
  133.             parent = curr;
  134.             if (liczba > curr -> liczba)// >
  135.  
  136.                 curr = curr -> prawy;
  137.             else curr = curr -> lewy;
  138.         }
  139.     }
  140.     if (!znaleziony)
  141.     {
  142.         cout << " Data not found! " << endl;
  143.         return wezel;
  144.     }
  145.  
  146.     bool usunieto = false;
  147.  
  148.  
  149.     if (!usunieto)
  150.     {
  151.         if ((curr->lewy == NULL && curr->prawy != NULL) || (curr->lewy != NULL && curr->prawy == NULL))
  152.         {
  153.             if (curr->lewy == NULL && curr->prawy != NULL)
  154.             {
  155.                 if (parent->lewy == curr)
  156.                 {
  157.                     parent->lewy = curr->prawy;
  158.                     delete curr;
  159.                 }
  160.                 else
  161.                 {
  162.                     parent->prawy = curr->prawy;
  163.                     delete curr;
  164.                 }
  165.             }
  166.             else
  167.             {
  168.                 if (parent->lewy == curr)
  169.                 {
  170.                     parent->lewy = curr->lewy;
  171.                     delete curr;
  172.                 }
  173.                 else
  174.                 {
  175.                     parent->prawy = curr->lewy;
  176.                     delete curr;
  177.                 }
  178.             }
  179.             usunieto = true;
  180.         }
  181.     }
  182.  
  183.     if (!usunieto)
  184.     {
  185.         if (curr->lewy == NULL && curr->prawy == NULL)
  186.         {
  187.             if (parent->lewy == curr) parent->lewy = NULL;
  188.             else parent->prawy = NULL;
  189.             delete curr;
  190.             usunieto = true;
  191.         }
  192.     }
  193.  
  194.     if (!usunieto)
  195.     {
  196.         if (curr->lewy != NULL && curr->prawy != NULL)
  197.         {
  198.             Drzewo* chkr;
  199.             chkr = curr->prawy;
  200.             if ((chkr->lewy == NULL) && (chkr->prawy == NULL))
  201.             {
  202.                 curr = chkr;
  203.                 delete chkr;
  204.                 curr->prawy = NULL;
  205.             }
  206.             else
  207.             {
  208.                 if ((curr->prawy)->lewy != NULL)
  209.                 {
  210.                     Drzewo* lcurr;
  211.                     Drzewo* lcurrp;
  212.                     lcurrp = curr->prawy;
  213.                     lcurr = (curr->prawy)->lewy;
  214.                     while (lcurr->lewy != NULL)
  215.                     {
  216.                         lcurrp = lcurr;
  217.                         lcurr = lcurr->lewy;
  218.                     }
  219.                     curr->liczba = lcurr->liczba;
  220.                     delete lcurr;
  221.                     lcurrp->lewy = NULL;
  222.                 }
  223.                 else
  224.                 {
  225.                     Drzewo* tmp;
  226.                     tmp = curr -> prawy;
  227.                     curr -> liczba = tmp -> liczba;
  228.                     curr -> prawy = tmp -> prawy;
  229.                     delete tmp;
  230.                 }
  231.  
  232.             }
  233.             usunieto = true;
  234.         }
  235.     }
  236.  
  237.     wezel -> waga = wysokosc(wezel -> lewy) - wysokosc(wezel -> prawy);
  238.  
  239.     // Left Left Case
  240.     if (wezel -> waga > 1 && liczba < wezel->lewy->liczba)
  241.     {
  242.         return rotacjaP(wezel);
  243.     }
  244.  
  245.     // Right Right Case
  246.     if (wezel -> waga < -1 && liczba > wezel -> prawy -> liczba)
  247.     {
  248.         return rotacjaL(wezel);
  249.     }
  250.  
  251.     // Left Right Case
  252.     if (wezel -> waga > 1 && liczba > wezel -> lewy -> liczba)
  253.     {
  254.         wezel -> lewy = rotacjaL(wezel -> lewy);
  255.         return rotacjaP(wezel);
  256.     }
  257.  
  258.     // Right Left Case
  259.     if (wezel -> waga < -1 && liczba < wezel -> prawy->liczba)
  260.     {
  261.         wezel -> prawy = rotacjaP(wezel -> prawy);
  262.         return rotacjaL(wezel);
  263.     }
  264.  
  265.     return wezel;
  266. }
  267.  
  268. // szuka podanego slowa w drzewie
  269. bool szukaj(Drzewo* korzen, string liczba)
  270. {
  271.     while (korzen != NULL)
  272.     {
  273.         if (liczba == korzen -> liczba)
  274.             return true;
  275.         if (liczba > korzen -> liczba)
  276.             korzen = korzen->prawy;
  277.         else korzen = korzen->lewy;
  278.     }
  279.     return false;
  280. }
  281.  
  282. // szuka podanego slowa w drzewie
  283. void prefiks(Drzewo *korzen, string liczba)
  284. {
  285.     if (korzen != NULL)
  286.     {
  287.         if (korzen -> liczba.find(liczba) == 0) ilosc_prefiksow++;
  288.         prefiks(korzen -> lewy, liczba);
  289.         prefiks(korzen -> prawy, liczba);
  290.     }
  291. }
  292.  
  293. int zliczPrefiks(Drzewo *korzen, string liczba)
  294. {
  295.     ilosc_prefiksow = 0;
  296.  
  297.     prefiks(korzen, liczba);
  298.  
  299.     return ilosc_prefiksow;
  300. }
  301.  
  302. // Print nodes at a given level
  303. void wypiszPoziom(Drzewo* korzen, int level)
  304. {
  305.     if (korzen == NULL)
  306.     {
  307.         //if( to jest najnizszy poziom drzewa) cout << "--";
  308.         cout << "  ";
  309.         return;
  310.     }
  311.     if (level == 1) cout << korzen->liczba << "   ";
  312.     else if (level > 1)
  313.     {
  314.         wypiszPoziom(korzen->lewy, level - 1);
  315.         wypiszPoziom(korzen->prawy, level - 1);
  316.     }
  317. }
  318.  
  319. void wypisz(Drzewo* korzen)
  320. {
  321.     int h = wysokosc(korzen);;
  322.     int i;
  323.     for (i = 1; i <= h; i++)
  324.     {
  325.         for (int j = h; j > i; j--) cout << " ";
  326.         wypiszPoziom(korzen, i);
  327.         cout << endl << endl;
  328.     }
  329. }
  330.  
  331.  
  332. int main()
  333. {
  334.     Drzewo *korzen = NULL;
  335.  
  336.     fstream plik;
  337.     plik.open("in.txt");
  338.     int ile;
  339.     plik >> ile;
  340.  
  341.     char p;
  342.     string x;
  343.  
  344.     for (int i = 0; i < ile; i++)
  345.     {
  346.         plik >> p >> x;
  347.         cout << "Polecenie: " << p << " x: " << x << endl;
  348.  
  349.  
  350.         if (p == 'W') korzen = dodaj(korzen, x);
  351.         if (p == 'U') korzen = usun(korzen, x);
  352.         if (p == 'S')
  353.         {
  354.             if (szukaj(korzen, x)) cout << "TAK" << endl;
  355.             else cout << "NIE" << endl;
  356.         }
  357.         if (p == 'L') cout << zliczPrefiks(korzen,x) << endl;
  358.     }
  359.     // nie ma rotacji jak w ostatnim przykladzie z pdfa !!!!!!!!!!!!!!!!!!!
  360.  
  361.     wypisz(korzen);
  362.     system("PAUSE");
  363.     return 0;
  364. }
  365.  
  366. // --------------------------------- K O N I E C ---------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement