Advertisement
soulrpg

AISD_Drzewa_v2

Apr 3rd, 2019
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.37 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <vector>
  5. #include <fstream>
  6.  
  7. using namespace std;
  8.  
  9. // struktura pojedynczego wezla
  10. struct Element
  11. {
  12.     int klucz;
  13.     Element *wsk_prawy;
  14.     Element *wsk_lewy;
  15.     // konstruktor automatycznie ustawia odpowiednie wartosci
  16.     Element(int wartosc)
  17.     {
  18.         klucz = wartosc;
  19.         wsk_prawy = NULL;
  20.         wsk_lewy = NULL;
  21.     }
  22. };
  23.  
  24. // generuje malejacy ciag o odpowiedniej dlugosci
  25. void generate_sequence(int sequence_size, vector <int> &numbers)
  26. {
  27.     srand(time(NULL));
  28.     numbers.push_back(rand()%100+1);
  29.     for(int i = 1; i < sequence_size; i++)
  30.     {
  31.         numbers.insert(numbers.begin(), numbers[0]+rand()%100+1);
  32.     }
  33. }
  34.  
  35. // przeksztalca ciag poprzez polowienie binarne na ciag, ktory pozwoli zbudowac drzewo AVL
  36. //                    FROM                  TO
  37. void sequence_for_AVL(vector <int> numbers, vector <int> &numbers_altered, int lewy, int prawy)
  38. {
  39.     int srodek = (lewy+prawy)/2;
  40.     //cout << "Numbers[srodek] " << "[" << srodek << "] " << numbers[srodek] << endl;
  41.     numbers_altered.push_back(numbers[srodek]);
  42.     // wywoluje polowienie rekurencyjnie
  43.     if(srodek-lewy>0)
  44.     {
  45.         sequence_for_AVL(numbers, numbers_altered, lewy, srodek);
  46.     }
  47.     if(prawy-srodek>1)
  48.     {
  49.         sequence_for_AVL(numbers, numbers_altered, srodek+1, prawy);
  50.     }
  51. }
  52.  
  53. // dodaje element (wartosc) do drzewa
  54. void add_element(Element * & wezel, int wartosc)
  55. {
  56.     // jezeli wezel jest pusty to po prostu wstawia na niego nowy element
  57.     if(wezel == NULL)
  58.     {
  59.         wezel = new Element(wartosc);
  60.     }
  61.     // jezeli nie no to wywolujemy funkcje rekurencyjnie dla lewego syna lub prawego
  62.     else
  63.     {
  64.         if(wartosc > wezel->klucz)
  65.         {
  66.             add_element(wezel->wsk_prawy, wartosc);
  67.         }
  68.         if(wartosc < wezel->klucz)
  69.         {
  70.             add_element(wezel->wsk_lewy, wartosc);
  71.         }
  72.     }
  73. }
  74.  
  75. void wyszukaj_MAX(Element * & wezel)
  76. {
  77.     if(wezel->wsk_prawy == NULL)
  78.     {
  79.         cout << endl;
  80.         cout << "MAX: " << wezel->klucz << endl;
  81.         cout << "---KONIEC PROCEDURY---" << endl;
  82.     }
  83.     else
  84.     {
  85.         cout << wezel->klucz << " ";
  86.         wyszukaj_MAX(wezel->wsk_prawy);
  87.     }
  88. }
  89.  
  90. int wyszukaj_element(int klucz, Element * & wezel)
  91. {
  92.     if(wezel == NULL)
  93.         return NULL;
  94.     if(wezel->klucz == klucz)
  95.     {
  96.         return int(&wezel);
  97.     }
  98.     else if(wezel->klucz > klucz)
  99.     {
  100.         wyszukaj_element(klucz, wezel->wsk_prawy);
  101.     }
  102.     else
  103.     {
  104.         wyszukaj_element(klucz, wezel->wsk_lewy);
  105.     }
  106. }
  107.  
  108. // NIE WIEM czy nie trzeba rozdzielic tego na dwie funkcje - szukanie elementu i usuwanie elementu
  109. void usuwanie_elementu(int klucz, Element * & wezel)
  110. {
  111.     if(wezel == NULL)
  112.         return;
  113.     if(wezel->klucz == klucz)
  114.     {
  115.         // To DO
  116.     }
  117.     else if(wezel->klucz > klucz)
  118.     {
  119.         usuwanie_elementu(klucz, wezel->wsk_prawy);
  120.     }
  121.     else
  122.     {
  123.         usuwanie_elementu(klucz, wezel->wsk_lewy);
  124.     }
  125. }
  126.  
  127. // wyswietla cale drzewo w porzadku pre-order
  128. void wyswietl_preorder(Element * & wezel)
  129. {
  130.     if(wezel == NULL)
  131.         return;
  132.     cout << wezel->klucz << " ";
  133.     wyswietl_preorder(wezel->wsk_lewy);
  134.     wyswietl_preorder(wezel->wsk_prawy);
  135. }
  136.  
  137. // wyswietla cale drzewo w porzadku in-order
  138. void wyswietl_inorder(Element * & wezel)
  139. {
  140.     if(wezel == NULL)
  141.         return;
  142.     wyswietl_inorder(wezel->wsk_lewy);
  143.     cout << wezel->klucz << " ";
  144.     wyswietl_inorder(wezel->wsk_prawy);
  145. }
  146.  
  147.  
  148. // usuwa cale drzewo w porzadku post-order
  149. void usun_postorder(Element * & wezel)
  150. {
  151.     if(wezel == NULL)
  152.         return;
  153.     usun_postorder(wezel->wsk_lewy);
  154.     usun_postorder(wezel->wsk_prawy);
  155.     delete wezel;
  156. }
  157.  
  158. int main()
  159. {
  160.     int sequence_size;
  161.     bool proper_value;
  162.     bool quit = false;
  163.     bool good_input = false;
  164.     int choice;
  165.     int klucz_usuwania;
  166.     vector <int> numbers;
  167.     vector <int> numbers_altered;
  168.     Element *root_BST = NULL;
  169.     Element *root_AVL = NULL;
  170.     while(!quit)
  171.     {
  172.         proper_value = false;
  173.         while(!proper_value)
  174.         {
  175.             cout << "Podaj wielkosc ciagu malejacego: ";
  176.             cin >> sequence_size;
  177.             if(cin && sequence_size > 0)
  178.             {
  179.                 generate_sequence(sequence_size, numbers);
  180.                 sequence_for_AVL(numbers, numbers_altered, 0, numbers.size());
  181.                 // tworzenie drzew BST i AVL
  182.                 for(int i = 0; i<numbers.size(); i++)
  183.                 {
  184.                     add_element(root_BST, numbers[i]);
  185.                     add_element(root_AVL, numbers_altered[i]);
  186.                 }
  187.                 // wyjscie z petli wewnetrznej programu
  188.                 proper_value = true;
  189.             }
  190.         }
  191.         while(!good_input)
  192.         {
  193.             // do zrobienia:  2  6  7
  194.             cout << "Wybierz akcje: 1)Wyszukaj MAX, 2)Usun wybrane wezly, 3)Wypisz in-order" << endl;
  195.             cout << "4)Wypisz pre-order, 5)Usun drzewo post-order, 6)Wypisz poddrzewo (pre-order)," << endl;
  196.             cout << "7)Rownowarz drzewo BST(DSW), 8)Wyjscie, Wybor:";
  197.             cin >> choice;
  198.             if(cin && choice > 0 && choice < 9)
  199.             {
  200.                 good_input = true;
  201.             }
  202.         }
  203.         switch(choice)
  204.         {
  205.         case 1:
  206.             cout << "Sciezka BST: ";
  207.             wyszukaj_MAX(root_BST);
  208.             cout << endl;
  209.             cout << "Sciezka AVL: ";
  210.             wyszukaj_MAX(root_AVL);
  211.             break;
  212.         /*case 2:
  213.             int ile_usunac;
  214.             int klucz;
  215.             bool user_input = false;
  216.             while(!user_input)
  217.             {
  218.                 cout << "Ile wezlow usunac?:";
  219.                 cin >> ile_usunac;
  220.                 if(cin && ile_usunac > 0 && ile_usunac < numbers.size())
  221.                 {
  222.                     user_input == true;
  223.                 }
  224.             }
  225.             for(int i = 1; i<=ile_usunac; i++)
  226.             {
  227.                 cout << "[" << i << "] klucz:";
  228.                 cin >> klucz;
  229.                 if(!cin)
  230.                 {
  231.                     cout << "Zly input!" << endl;
  232.                     exit(0);
  233.                 }
  234.                 else
  235.                 {
  236.                     usuwanie_elementu(klucz, root_BST);
  237.                     usuwanie_elementu(klucz, root_AVL);
  238.                 }
  239.             }
  240.             break;*/
  241.         case 3:
  242.             cout << "BST pre-order: " << endl;
  243.             wyswietl_preorder(root_BST);
  244.             cout << endl;
  245.             cout << "--- KONIEC PROCEDURY ---" << endl;
  246.             cout << "AVL pre-order: " << endl;
  247.             wyswietl_preorder(root_AVL);
  248.             cout << endl;
  249.             cout << "--- KONIEC PROCEDURY ---" << endl;
  250.             break;
  251.         case 4:
  252.             cout << "BST in-order: " << endl;
  253.             wyswietl_inorder(root_BST);
  254.             cout << endl;
  255.             cout << "--- KONIEC PROCEDURY ---" << endl;
  256.             cout << "AVL in-order: " << endl;
  257.             wyswietl_inorder(root_AVL);
  258.             cout << endl;
  259.             cout << "--- KONIEC PROCEDURY ---" << endl;
  260.             break;
  261.         case 5:
  262.             cout << "BST usun post-order... " << endl;
  263.             usun_postorder(root_BST);
  264.             cout << endl;
  265.             cout << "--- KONIEC PROCEDURY ---" << endl;
  266.             cout << "AVL usun post-order... " << endl;
  267.             usun_postorder(root_AVL);
  268.             cout << endl;
  269.             cout << "--- KONIEC PROCEDURY ---" << endl;
  270.             break;
  271.         /*case 6:
  272.             cout << "Usuwanie poddrzewa. Podaj klucz: ";
  273.             cin >> klucz_usuwania;
  274.             if(!cin)
  275.             {
  276.                 cout << "Blad wejscia!" << endl;
  277.                 exit(0);
  278.             }
  279.             cout << "USUWANIE Z BST..." << endl;
  280.             if(wyszukaj_element(klucz_usuwania, root_BST))
  281.             {
  282.                 usun_postorder(wyszukaj_element(klucz_usuwania, root_BST));
  283.             }
  284.             cout << "USUWANIE Z AVL..." << endl;
  285.             if(wyszukaj_element(klucz_usuwania, root_AVL))
  286.             {
  287.                 usun_postorder(wyszukaj_element(klucz_usuwania, root_AVL);
  288.             }
  289.             cout << "--- KONIEC PROCEDURY ---" << endl;
  290.         */
  291.         case 8:
  292.             exit(0);
  293.             break;
  294.         }
  295.  
  296.     }
  297.     return 0;
  298. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement