Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Nagłówek.h"
- #include <iostream>
- #include <cstdlib>
- #include <time.h>
- #include <ctime>
- #include <string>
- #include <random>
- using namespace std;
- template<typename T>
- class Wezel {
- public:
- T dane;
- Wezel *up, *left, *right;
- long long indeks;
- bool color; //0 czarny 1 czerwony
- Wezel()
- {
- up, left, right = nullptr;
- indeks = 0;
- color = 0;
- }
- ~Wezel()
- {
- delete right, left;
- }
- };
- template<typename T>
- class Drzewo {
- private:
- Wezel <T> * root;
- unsigned int counter;
- public:
- Drzewo() {
- root = nullptr;
- /* root->up = nullptr;
- root->left = nullptr;
- root->right = nullptr;*/
- counter = 0;
- }
- ~Drzewo() {
- del(root);
- }
- void del(Wezel <T> *wsk)
- {
- if (wsk)
- {
- del(wsk->left);
- del(wsk->right);
- delete wsk;
- }
- }
- void usun()
- {
- del(root);
- }
- void dodaj_nowy_element(const T &obiekt)
- {
- Wezel<T> *nowy_obiekt = new Wezel<T>;
- Wezel<T> *p;
- nowy_obiekt->dane = obiekt;
- nowy_obiekt->left = nullptr;
- nowy_obiekt->right = nullptr;
- nowy_obiekt->indeks = counter;
- counter++;
- p = root;
- if (p)
- {
- for (;;)
- {
- if (p->dane < obiekt)
- {
- if (p->right)
- {
- p = p->right;
- }
- else
- {
- p->right = nowy_obiekt;
- nowy_obiekt->up = p;
- break;
- }
- }
- else
- {
- if (p->left)
- {
- p = p->left;
- }
- else
- {
- p->left = nowy_obiekt;
- nowy_obiekt->up = p;
- break;
- }
- }
- }
- }
- else
- {
- root = nowy_obiekt;
- }//znalezienie miejsca
- nowy_obiekt->color = 1;
- while( (nowy_obiekt !=root)&&(nowy_obiekt->up->color==1))
- {
- if (nowy_obiekt->up == nowy_obiekt->up->up->left)
- {
- if (nowy_obiekt->up->up->right)
- {
- p = nowy_obiekt->up->up->right; //stryj
- if (p->color == 1) //przypadek1
- {
- nowy_obiekt->up->color = 0;
- p->color = 0;
- nowy_obiekt->up->up->color = 1;
- nowy_obiekt = nowy_obiekt->up->up;
- continue;
- }
- }
- if (nowy_obiekt == nowy_obiekt->up->right)
- {
- nowy_obiekt = nowy_obiekt->up;
- rotacja_l(nowy_obiekt);
- }
- nowy_obiekt->up->color = 0;
- nowy_obiekt->up->up->color = 1;
- rotacja_r(nowy_obiekt->up->up);
- break;
- }
- else
- {//tutaj sie wykrzacza bo stryjka nie ma
- if (nowy_obiekt->up->up->left)
- {
- p = nowy_obiekt->up->up->left;
- if (p->color == 1)
- {
- nowy_obiekt->up->color = 0;
- p->color = 0;
- nowy_obiekt->up->up->color = 1;
- nowy_obiekt = nowy_obiekt->up->up;
- continue;
- }
- }
- if (nowy_obiekt == nowy_obiekt->up->left)
- {
- nowy_obiekt = nowy_obiekt->up;
- rotacja_r(nowy_obiekt);
- }
- nowy_obiekt->up->color = 0;
- nowy_obiekt->up->up->color = 1;
- rotacja_l(nowy_obiekt->up->up);
- break;
- }
- }
- root->color = 0;
- }
- void in(Wezel <T> *wsk)
- {
- if (wsk)
- {
- in(wsk->left);
- cout << "indeks: " << wsk->indeks << " dane: " << wsk->dane << endl;
- in(wsk->right);
- }
- }
- void pre(Wezel <T> *wsk)
- {
- if (wsk)
- {
- cout << "indeks: " << wsk->indeks << " dane: " << wsk->dane << endl;
- pre(wsk->left);
- pre(wsk->right);
- }
- }
- Wezel <T> *search(const T &obiekt)
- {
- Wezel <T> *p;
- p = root;
- while (p)
- {
- if (obiekt < p->dane)
- {
- p=p->left;
- }
- else if (p->dane<obiekt)
- {
- p = p->right;
- }
- else
- {
- cout << "znalezionio! indeks: " << p->indeks << endl;
- return p;
- }
- }
- cout << "nie ma takiego obiektu" << endl;
- return p;
- }
- int wys(Wezel <T> *wsk)
- {
- if (wsk == nullptr) return 0;
- int wl = wys(wsk->left);
- int wr = wys(wsk->right);
- if (wl < wr) return wr+1;
- else return wl+1;
- }
- void wysokosc()
- {
- int high=wys(root);
- cout << "wysokosc wynosi: " << high<<endl;
- }
- //void rotacja_l(Wezel <T> *dziecko, Wezel <T> *rodzic)
- //{
- // if (dziecko)
- // {
- // rodzic->right = dziecko->left;
- // if (rodzic->right) rodzic->right->up = rodzic;
- // dziecko->left = rodzic;
- // dziecko->up = rodzic->up;
- // rodzic->up = dziecko;
- // if (dziecko->up)
- // {
- // if (dziecko->up->left == dziecko) dziecko->up->left = dziecko;
- // else dziecko->up->right = dziecko;
- // }
- // else root = dziecko;
- // }
- //
- //}
- void rotacja_l(Wezel <T> *rodzic)
- {
- Wezel <T> *dziecko,*p;
- dziecko = rodzic->right;
- if (dziecko)
- {
- p = rodzic->up;
- rodzic->right = dziecko->left;
- if (rodzic->right) rodzic->right->up = rodzic;
- dziecko->left = rodzic;
- dziecko->up =p;
- rodzic->up = dziecko;
- if (dziecko->up)
- {
- if (p->left == dziecko) p->left = dziecko;
- else p->right = dziecko;
- }
- else root = dziecko;
- }
- }
- //void rotacja_r(Wezel <T> *dziecko, Wezel <T> *rodzic)
- //{
- // if (dziecko)
- // {
- // rodzic->left = dziecko->right;
- // if (rodzic->left) rodzic->left->up = rodzic;
- // dziecko->right = rodzic;
- // dziecko->up = rodzic->up;
- // rodzic->up = dziecko;
- // if (dziecko->up)
- // {
- // if (dziecko->up->left == dziecko) dziecko->up->left = dziecko;
- // else dziecko->up->right = dziecko;
- // }
- // else root = dziecko;
- // }
- //
- //}
- void rotacja_r(Wezel <T> *rodzic)
- {
- Wezel<T> *dziecko, *p;
- dziecko = rodzic->left;
- if (dziecko)
- {
- p = rodzic -> up;
- rodzic->left = dziecko->right;
- if (rodzic->left) rodzic->left->up = rodzic;
- dziecko->right = rodzic;
- dziecko->up = p;
- rodzic->up = dziecko;
- if (p)
- {
- if (p->left == dziecko) p->left = dziecko;
- else p->right = dziecko;
- }
- else root = dziecko;
- }
- }
- void in_order()
- {
- in(root);
- }
- void pre_order()
- {
- pre(root);
- }
- void printer(Wezel <T> *wsk)
- {
- if (wsk)
- {
- if (wsk->color == 1)
- {
- if ((wsk->up == nullptr) && (wsk->right == nullptr) && (wsk->left == nullptr)) cout << "(" << wsk->indeks << ": [" << "RED" << ", p: NULL, l: NULL, r: NULL] (" << wsk->dane << "))," << endl;
- else if ((wsk->up == nullptr) && (wsk->right != nullptr) && (wsk->left != nullptr)) cout << "(" << wsk->indeks << ": [" << "RED" << ", p: NULL, l: " << wsk->left->indeks << ", r: " << wsk->right->indeks << "] (" << wsk->dane << "))," << endl;
- else if ((wsk->up == nullptr) && (wsk->right == nullptr) && (wsk->left != nullptr)) cout << "(" << wsk->indeks << ": [" << "RED" << ", p: NULL, l: " << wsk->left->indeks << " r: NULL] (" << wsk->dane << "))," << endl;
- else if ((wsk->up == nullptr) && (wsk->right != nullptr) && (wsk->left == nullptr)) cout << "(" << wsk->indeks << ": [" << "RED" << ", p: NULL, l: NULL, r: " << wsk->right->indeks << "] (" << wsk->dane << "))," << endl;
- if ((wsk->up != nullptr) && (wsk->right == nullptr) && (wsk->left == nullptr)) cout << "(" << wsk->indeks << ": [" << "RED" << ", p: " << wsk->up->indeks << ", l: NULL, r: NULL] (" << wsk->dane << "))," << endl;
- else if ((wsk->up != nullptr) && (wsk->right != nullptr) && (wsk->left != nullptr)) cout << "(" << wsk->indeks << ": [" << "RED" << ", p: " << wsk->up->indeks << ", l: " << wsk->left->indeks << ", r: " << wsk->right->indeks << "] (" << wsk->dane << "))," << endl;
- else if ((wsk->up != nullptr) && (wsk->right == nullptr) && (wsk->left != nullptr)) cout << "(" << wsk->indeks << ": [" << "RED" << ", p: " << wsk->up->indeks << ", l: " << wsk->left->indeks << " r: NULL] (" << wsk->dane << "))," << endl;
- else if ((wsk->up != nullptr) && (wsk->right != nullptr) && (wsk->left == nullptr)) cout << "(" << wsk->indeks << ": [" << "RED" << ", p: " << wsk->up->indeks << ", l: NULL, r: " << wsk->right->indeks << "] (" << wsk->dane << "))," << endl;
- }
- else
- {
- if ((wsk->up == nullptr) && (wsk->right == nullptr) && (wsk->left == nullptr)) cout << "(" << wsk->indeks << ": [" << "BLACK" << ", p: NULL, l: NULL, r: NULL] (" << wsk->dane << "))," << endl;
- else if ((wsk->up == nullptr) && (wsk->right != nullptr) && (wsk->left != nullptr)) cout << "(" << wsk->indeks << ": [" << "BLACK" << ", p: NULL, l: " << wsk->left->indeks << ", r: " << wsk->right->indeks << "] (" << wsk->dane << "))," << endl;
- else if ((wsk->up == nullptr) && (wsk->right == nullptr) && (wsk->left != nullptr)) cout << "(" << wsk->indeks << ": [" << "BLACK" << ", p: NULL, l: " << wsk->left->indeks << " r: NULL] (" << wsk->dane << "))," << endl;
- else if ((wsk->up == nullptr) && (wsk->right != nullptr) && (wsk->left == nullptr)) cout << "(" << wsk->indeks << ": [" << "BLACK" << ", p: NULL, l: NULL, r: " << wsk->right->indeks << "] (" << wsk->dane << "))," << endl;
- if ((wsk->up != nullptr) && (wsk->right == nullptr) && (wsk->left == nullptr)) cout << "(" << wsk->indeks << ": [" << "BLACK" << ", p: " << wsk->up->indeks << ", l: NULL, r: NULL] (" << wsk->dane << "))," << endl;
- else if ((wsk->up != nullptr) && (wsk->right != nullptr) && (wsk->left != nullptr)) cout << "(" << wsk->indeks << ": [" << "BLACK" << ", p: " << wsk->up->indeks << ", l: " << wsk->left->indeks << ", r: " << wsk->right->indeks << "] (" << wsk->dane << "))," << endl;
- else if ((wsk->up != nullptr) && (wsk->right == nullptr) && (wsk->left != nullptr)) cout << "(" << wsk->indeks << ": [" << "BLACK" << ", p: " << wsk->up->indeks << ", l: " << wsk->left->indeks << " r: NULL] (" << wsk->dane << "))," << endl;
- else if ((wsk->up != nullptr) && (wsk->right != nullptr) && (wsk->left == nullptr)) cout << "(" << wsk->indeks << ": [" << "BLACK" << ", p: " << wsk->up->indeks << ", l: NULL, r: " << wsk->right->indeks << "] (" << wsk->dane << "))," << endl;
- }
- printer(wsk->left);
- printer(wsk->right);
- }
- }
- //bool spr()
- void print()
- {
- //wysokosc();
- printer(root);
- }
- };
- std::random_device rd;
- std::default_random_engine generator(rd());
- std::uniform_int_distribution<long long> zakres(0, 10000000);
- struct fruct
- {
- long long a;
- char b;
- fruct()
- {
- a =zakres(generator);
- b = 'S';
- }
- fruct(int x, char y)
- {
- a = x;
- b = y;
- }
- bool operator <(const fruct &n) const{
- return (a < n.a);
- }
- bool operator >(const fruct &n)const{
- return (a > n.a);
- }
- bool operator ==(const fruct &n)const{
- return (a == n.a);
- }
- };
- ostream &operator <<(ostream&stream, const fruct &n)
- {
- return (stream << n.a <<","<< n.b);
- }
- int main() {
- Drzewo<fruct> *d1=new Drzewo<fruct>();
- const int max_order = 1;
- //for (int i = 1; i <= max_order; i++)
- //{
- for (int j = 0; j <100; j++)
- {
- d1->dodaj_nowy_element(fruct{});
- }
- //}
- d1->print();
- // d1->pre_order();
- //int licznik_powtorzen=0;
- //long long a=0;
- //
- //for (long long i = 0; i < 100; i++)
- //{
- //
- // a =zakres(generator);
- // tab[i] = a;
- // for (long long j = 0; j < i; j++)
- // {
- // if (tab[j] == tab[i])
- // {
- // licznik_powtorzen++;
- // }
- // }
- //}
- //cout << licznik_powtorzen << "===" << endl;
- /*int liczba = 0;*/
- //for (int i = 0; i < 10; i++)
- //{
- // liczba = rand() % 1000;
- // cout << liczba << endl;
- //// d1.dodaj_nowy_element(liczba);
- ////}
- //Drzewo<int> d1;
- //for (int i = 0; i < 1000; i++)
- //{
- // d1.dodaj_nowy_element(rand()%32000);
- //}
- //d1.dodaj_nowy_element(55);
- //d1.dodaj_nowy_element(69);
- //d1.dodaj_nowy_element(62);
- //d1.dodaj_nowy_element(57);
- //d1.dodaj_nowy_element(35);
- //d1.dodaj_nowy_element(83);
- //d1.dodaj_nowy_element(72);
- //d1.dodaj_nowy_element(74);
- //d1.pre_order();
- //d1.dodaj_nowy_element(20);
- //d1.dodaj_nowy_element(2);
- //d1.dodaj_nowy_element(34);
- //d1.dodaj_nowy_element(16);
- //d1.dodaj_nowy_element(96);
- //d1.dodaj_nowy_element(12);
- //d1.dodaj_nowy_element(9);
- //d1.dodaj_nowy_element(44);
- //d1.dodaj_nowy_element(4);
- //d1.dodaj_nowy_element(88);
- //d1.dodaj_nowy_element(77);
- //d1.dodaj_nowy_element(66);
- //d1.dodaj_nowy_element(55);
- //d1.dodaj_nowy_element(33);
- //d1.dodaj_nowy_element(22);
- //d1.dodaj_nowy_element(11);
- //d1.dodaj_nowy_element(67);
- //d1.dodaj_nowy_element(52);
- //d1.dodaj_nowy_element(31);
- //d1.dodaj_nowy_element(16);
- //d1.dodaj_nowy_element(47);
- //d1.dodaj_nowy_element(99);
- //d1.dodaj_nowy_element(1);
- //d1.dodaj_nowy_element(53);
- //d1.dodaj_nowy_element(1);
- //d1.dodaj_nowy_element(2);
- //d1.dodaj_nowy_element(3);
- //d1.dodaj_nowy_element(59);
- //d1.dodaj_nowy_element(66);
- /*d1.dodaj_nowy_element(3535);
- d1.dodaj_nowy_element(9989);
- d1.dodaj_nowy_element(66765);
- d1.dodaj_nowy_element(353);*/
- //d1.print();
- //
- //d1.search(2);
- //d1.search(66);
- //d1.wysokosc();
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement