Advertisement
lewapkon

bst

Feb 23rd, 2015
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.02 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdlib.h>
  3.  
  4. using namespace std;
  5.  
  6. // struktura przechowujaca wezel drzewa
  7. struct SWezel
  8. {
  9.     int dana;
  10.     SWezel *lewySyn;
  11.     SWezel *prawySyn;
  12. } *korzen = NULL; // tworzymy korzen drzewa
  13.  
  14. // funkcja tworzaca zmienna typu SWezel
  15. SWezel* stworzNowyWezel(int liczba)
  16. {
  17.     SWezel* nowyWezel = new SWezel;
  18.     nowyWezel->lewySyn = NULL;
  19.     nowyWezel->prawySyn = NULL;
  20.     nowyWezel->dana = liczba;
  21.    
  22.     return nowyWezel;
  23. }
  24.  
  25. // funkcja dodajaca nowy element do drzewa, korzystajaca z rekurencji
  26. void dodajWezel(SWezel *wezelPoczatkowy, int liczba)
  27. {
  28.     if(korzen == NULL) // gdy drzewo jest puste, korzen jest zmienna globalna przechowujaca korzen tworzonego drzewa
  29.     {
  30.         korzen = stworzNowyWezel(liczba); // tworzenie pierwszego wezla w drzewie
  31.     }
  32.     else // jezeli drzewo niepuste
  33.     {
  34.         // jezeli nowa liczba mniejsza od wartosci w wezle dodaj do lewego podrzewa
  35.         if(liczba < wezelPoczatkowy->dana)
  36.         {
  37.             // jezeli lewy syn nie jest pusty wywolaj rekurenyjnie dodawanie do lewego podrzewa
  38.             if(wezelPoczatkowy->lewySyn != NULL)
  39.             {
  40.                 dodajWezel(wezelPoczatkowy->lewySyn, liczba);
  41.             }
  42.             // jezeli lewe podrzewo nie istnieje, to niech lewy syn wskazuje na nowo utworzony wezel z nowa wartoscia
  43.             else
  44.             {
  45.                 wezelPoczatkowy->lewySyn = stworzNowyWezel(liczba);
  46.             }
  47.         }
  48.         // jezeli nowa liczba rowna lub wieksza od wartosci w wezle dodaj do prawego podrzewa
  49.         else
  50.         {
  51.             // jezeli prawy syn nie jest pusty wywolaj rekurenyjnie dodawanie do prawego podrzewa
  52.             if(wezelPoczatkowy->prawySyn != NULL)
  53.             {
  54.                 dodajWezel(wezelPoczatkowy->prawySyn, liczba);
  55.             }
  56.             // jezeli prawe podrzewo nie istnieje, to niech prawy syn wskazuje na nowo utworzony wezel z nowa wartoscia
  57.             else
  58.             {
  59.                 wezelPoczatkowy->prawySyn = stworzNowyWezel(liczba);
  60.             }
  61.         }
  62.     }
  63. }
  64.  
  65. // funkca rekurencyjnie przegladajaca drzewo
  66. void wypiszDrzewoNiemalejaco(SWezel *wezelPoczatkowy)
  67. {
  68.     // jezeli wezel nie jest pusty
  69.     if(wezelPoczatkowy != NULL)
  70.     {
  71.         // rekurencyjnie wypisz lewe poddrzewo
  72.         wypiszDrzewoNiemalejaco(wezelPoczatkowy->lewySyn);
  73.         // wypisz wartosc aktualnego wezla
  74.         cout << wezelPoczatkowy->dana << ", ";
  75.         // rekurencyjnie wypisz prawe poddrzewo
  76.         wypiszDrzewoNiemalejaco(wezelPoczatkowy->prawySyn);
  77.     }
  78. }
  79.  
  80. bool szukajR(SWezel *wezelPoczatkowy, int liczba)
  81. {
  82.     if (wezelPoczatkowy == NULL)
  83.         return false;
  84.     else if (liczba == wezelPoczatkowy->dana)
  85.         return true;
  86.     else if (liczba < wezelPoczatkowy->dana)
  87.         return szukajR(wezelPoczatkowy->lewySyn, liczba);
  88.     else
  89.         return szukajR(wezelPoczatkowy->prawySyn, liczba);
  90. }
  91.  
  92. bool szukajI(int liczba)
  93. {
  94.     SWezel *wezel = korzen;
  95.     while (wezel != NULL)
  96.     {
  97.         if (liczba == wezel->dana)
  98.             return true;
  99.         else if (liczba < wezel->dana)
  100.             wezel = wezel->lewySyn;
  101.         else
  102.             wezel = wezel->prawySyn;
  103.     }
  104.     return false;
  105. }
  106.  
  107. int main()
  108. {
  109.     cout << "Wygenerowane losowe liczby: ";
  110.     srand(time(NULL));
  111.     // wygeneruj 10 losowych liczb
  112.     for (int i = 0; i < 10; i++)
  113.     {
  114.         int liczba = rand() % 100 + 1; // liczby z przedzialu <1, 100>
  115.         cout << liczba << ", ";
  116.         dodajWezel(korzen, liczba); // dodawaj wygenerowane liczby do drzewa
  117.     }
  118.    
  119.     cout<<"\n\nPosortowane elemnty z drzewa: ";
  120.    
  121.     wypiszDrzewoNiemalejaco(korzen); // wypisz elemnety drzewa w osortowanej kolejnosci
  122.    
  123.     cout << endl << (szukajR(korzen, 16) ? "16 jest w drzewie" : "nie ma 16 w drzewie") << endl;
  124.     cout << (szukajI(23) ? "23 jest w drzewie" : "nie ma 23 w drzewie") << endl;
  125.    
  126.     delete korzen;
  127.    
  128.     cout << endl << "\n\nNacisnij ENTER, aby kontynuowac...";
  129.     cin.get();
  130.    
  131.     return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement