nodrze.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885
  1. #ifndef _NODRZE_H
  2. #define _NODRZE_H
  3. //don't look here, it's a horrible, partially working implementation of RB trees
  4. //ignore comment above, it is simply TowDragon's envy. Everything (without removing) is working fine
  5. #include <iostream>
  6. #include <string>
  7. #define LOGUJ ;
  8. #define CLOG ;
  9. #ifndef LOGUJ
  10. #define LOGUJ(a) (std::cout<<a)
  11. #define CLOG(a) (std::cout<<a)
  12. #endif
  13. const bool CZERWONY=true, CZARNY=false;
  14. class TTAICore;
  15. extern TTAICore * C;
  16. template <typename T> class wezel
  17. {
  18. public:
  19. bool kolor:1;
  20. T * zawart;
  21. wezel * ojciec, *lewy, *prawy;
  22. wezel(bool kol):kolor(kol),ojciec(NULL),lewy(NULL),prawy(NULL){zawart = new T;};
  23. wezel(wezel * NIL);
  24. ~wezel(){delete zawart;}
  25. };
  26. template <typename T> std::ostream & piszAdresy(std::ostream & strum, wezel<T> & w)
  27. {
  28. strum << "Informacje o wezle: "<<&w;
  29. strum <<"\n\tOjciec: "<<(w.ojciec);
  30. strum<<"\n\tLewy syn: "<<(w.lewy);
  31. strum<<"\n\tPrawy syn: "<<(w.prawy);
  32. strum<<"\n\tKolor: "<<((w.kolor)?(std::string("Czerwony")):(std::string("Czarny")))<<std::endl<<std::endl;
  33. return strum;
  34. }
  35. template <typename T> std::ostream & operator<<(std::ostream & strum, wezel<T> & w)
  36. {
  37. strum << "Informacje o wezle: "<<&w<<" - "<<*w.zawart;
  38. strum <<"\n\tOjciec: "<<(w.ojciec)<<" - "<<*w.ojciec->zawart;
  39. strum<<"\n\tLewy syn: "<<(w.lewy)<<" - "<<*w.lewy->zawart;
  40. strum<<"\n\tPrawy syn: "<<(w.prawy)<<" - "<<*w.prawy->zawart;
  41. strum<<"\n\tKolor: "<<((w.kolor)?(std::string("Czerwony")):(std::string("Czarny")))<<std::endl<<std::endl;
  42. return strum;
  43. }
  44. template <typename T> wezel<T>::wezel(wezel * NIL)
  45. {
  46. ojciec=NIL; lewy=NIL; prawy=NIL; kolor=CZERWONY; zawart = NULL;
  47. }
  48. template <typename T> class nodrze
  49. {
  50. private:
  51. wezel<T> * NIL, *ostatnio;
  52. int ile, ktory;
  53. void zepsuj();
  54. void dodajBSTC (wezel<T> * nowy);
  55. void dodajBST (T co);
  56. void dodajRBT (wezel<T> * nowy);
  57. wezel<T> * usunRBT (wezel<T> * nowy);
  58. void naprawWstaw (wezel<T> * nowy);
  59. void naprawUsun (wezel<T> * x);
  60. wezel<T> * minimum(wezel<T> * w);
  61. wezel<T> * maksimum(wezel<T> * w);
  62. wezel<T> * nastepnik(wezel<T> * w);
  63. wezel<T> * poprzednik(wezel<T> * w);
  64. wezel<T> * szukajRek(wezel<T> * w, T co);
  65. wezel<T> * szukajIter(wezel<T> * w, T co);
  66. void in(std::ostream & strum, wezel<T> * wsk);
  67. void inIt(std::ostream & strum, wezel<T> * wsk);
  68. void pre(std::ostream & strum, wezel<T> * wsk);
  69. void post(std::ostream & strum, wezel<T> * wsk);
  70. void rotacjaLewa (wezel<T> * x);
  71. void rotacjaPrawa (wezel<T> * y);
  72. bool czyBST (wezel<T> * w);
  73. bool sprawdzW(wezel<T> * w);
  74. void destrukcja(wezel<T> * w);
  75. void wypisuj(wezel<T> * w, std::ostream & strum);
  76. void wypisujPre(wezel<T> * w, std::ostream & strum);
  77. public:
  78. wezel<T> * korzen;
  79. nodrze():ile(0) //najzwyczajniejszy w swiecie kosntruktor
  80. {
  81. NIL=new wezel<T>(CZARNY);
  82. korzen=NIL;
  83. ostatnio=NIL;
  84. ktory=0;
  85. };
  86. T * begin () {return minimumimum();};
  87. T * end () {return NIL;};
  88. void clear(); // czysci az do korzenia wlacznie
  89. void usun (T co); // usuwa element z drzewa
  90. bool sprawdz(); // sprawdza, czy drzewo jest poprawnym drzewem BST
  91. T * nast(T czego); // nastepnik zadenego elementu
  92. T * maksimumimum (); // najwiekszy element w drzewie
  93. bool czyJest(T co); // czy cos jest w drzewie
  94. T * minimumimum (); // najmniejszy element w drzewie
  95. void dodaj (T co); // dodaje element do drzewa
  96. void inorder(std::ostream & strum); // wypisuje na zadane wyjscie elementy w porzadku inorder
  97. void preorder(std::ostream & strum); // wypisuje na zadane wyjscie elementy w porzadku preorder
  98. void postorder(std::ostream & strum); // wypisuje na zadane wyjscie elementy w porzadku postorder
  99. void wypiszObficie(std::ostream & strum); //wypisuje dane o kazdym wezle -- wymaga operatora >> dla zawartosci
  100. T * znajdz (T co, bool iter = true); // wyszukuje zadany element
  101. int size(); //ilosc elementow
  102. T* operator()(int i) ; //n-ty element przez wskaxnik
  103. nodrze<T> & operator()(std::istream & potoczek) ; //zczytanie n elemntow z listy
  104. T& operator[](int i) ; //dostep do obiektu, ale przez wartosc
  105. bool operator+=(T * co);
  106. bool operator+=(T co);
  107. bool operator-=(T co);
  108. bool operator-=(T * co);
  109. T* operator%(T * co);
  110. bool operator&(T co);
  111. bool operator&(T * co);
  112. template <typename Y, class X> friend Y* operator%(nodrze<Y> & drzewko, X co);
  113. void push_back(T co){(*this)+=co;};
  114. };
  115. template <typename T> void nodrze<T>::wypisuj(wezel<T> * w, std::ostream & strum)
  116. {
  117. if (w==NIL) return;
  118. wypisuj(w->lewy, strum);
  119. strum << "Informacje o wezle: "<<flush<<w<<flush;
  120. if (w->ojciec!=NIL)
  121. strum <<"\n\tOjciec: "<<(w->ojciec)<<" - "<<*(w->ojciec->zawart);
  122. else strum <<"\n\tOjciec: NIL";
  123. if (w->lewy!=NIL)
  124. strum<<"\n\tLewy syn: "<<(w->lewy)<<" - "<<*(w->lewy->zawart);
  125. else strum <<"\n\tLewy syn: NIL";
  126. if (w->prawy!=NIL)
  127. strum<<"\n\tPrawy syn: "<<(w->prawy)<<" - "<<*(w->prawy->zawart);
  128. else strum <<"\n\tPrawy syn: NIL";
  129. strum<<"\n\tZawartosc: "<<*w->zawart;
  130. strum<<"\n\tKolor: "<<((w->kolor)?(std::string("Czerwony")):(std::string("Czarny")))<<std::endl<<std::endl;
  131. wypisuj(w->prawy, strum);
  132. }
  133. template <typename T> void nodrze<T>::wypisujPre(wezel<T> * w, std::ostream & strum)
  134. {
  135. if (w==NIL) return;
  136. strum << "Informacje o wezle: "<<flush<<w<<flush;
  137. if (w->ojciec!=NIL)
  138. strum <<"\n\tOjciec: "<<(w->ojciec)<<" - "<<*(w->ojciec->zawart);
  139. else strum <<"\n\tOjciec: NIL";
  140. if (w->lewy!=NIL)
  141. strum<<"\n\tLewy syn: "<<(w->lewy)<<" - "<<*(w->lewy->zawart);
  142. else strum <<"\n\tLewy syn: NIL";
  143. if (w->prawy!=NIL)
  144. strum<<"\n\tPrawy syn: "<<(w->prawy)<<" - "<<*(w->prawy->zawart);
  145. else strum <<"\n\tPrawy syn: NIL";
  146. strum<<"\n\tZawartosc: "<<*w->zawart;
  147. strum<<"\n\tKolor: "<<((w->kolor)?(std::string("Czerwony")):(std::string("Czarny")))<<std::endl<<std::endl;
  148. wypisujPre(w->lewy, strum);
  149. wypisujPre(w->prawy, strum);
  150. }
  151. template <typename T> void nodrze<T>::wypiszObficie(std::ostream & strum)
  152. {
  153. strum << "Nodrze " <<this<<" ma " << ile << " elementów."<<std::endl;
  154. strum << "NIL to " << NIL <<std::endl;
  155. strum << "Ostatnio bralismy "<<ktory<<flush<<" element, czyli "<<" ("<<ostatnio<<")"<<flush<<*ostatnio<<flush<<std::endl;
  156. strum << "Nasze wezly in-order"<<std::endl;
  157. wypisujPre(korzen,strum);
  158. };
  159. template <typename T, class X> T* operator%(nodrze<T> & drzewko, X co)
  160. {
  161. CLOG ("Szukam " <<co <<std::endl);
  162. drzewko.wypiszObficie(*C->gl->loguj);
  163. wezel<T> * w = drzewko.korzen;
  164. while (w!=drzewko.NIL && (*w->zawart)!=co)
  165. {
  166. if ((*w->zawart) > co)
  167. w=w->lewy;
  168. else w=w->prawy;
  169. }
  170. return w->zawart;
  171. };
  172. template <typename T> int nodrze<T>::size()
  173. {
  174. return ile;
  175. }
  176. template <typename T> void nodrze<T>::clear()
  177. {
  178. destrukcja(korzen);
  179. korzen=NIL;
  180. ostatnio=NIL;
  181. ktory=0;
  182. }
  183. template <typename T> void nodrze<T>::destrukcja(wezel<T> * w)
  184. {
  185. if (w==NIL) return;
  186. destrukcja(w->lewy);
  187. destrukcja(w->prawy);
  188. //delete w->zawart;
  189. delete w;
  190. };
  191. template <typename T> nodrze<T> & nodrze<T>::operator()(std::istream & potoczek)
  192. {
  193. int temp;
  194. potoczek >> temp;
  195. for (int i=0;i<temp;++i)
  196. potoczek >> (*this);
  197. return (*this);
  198. }
  199. template <typename T> T* nodrze<T>::operator()(int i)
  200. {
  201. int j;
  202. wezel<T> * nasz;
  203. if (ostatnio!=NIL)
  204. {
  205. j=i-ktory;
  206. if (j>0)
  207. {
  208. if (j > (ile-i))
  209. {
  210. ktory = i;
  211. i=ile-i-1;
  212. nasz = maksimum(korzen);
  213. for (j=0;j<i;j++)
  214. {
  215. nasz = poprzednik(nasz);
  216. }
  217. ostatnio=nasz;
  218. return (nasz->zawart);
  219. }
  220. else
  221. {
  222. ktory = i;
  223. nasz = ostatnio;
  224. for (i=0;i<j;i++)
  225. {
  226. nasz = nastepnik(nasz);
  227. }
  228. ostatnio=nasz;
  229. return (nasz->zawart);
  230. }
  231. }
  232. if (j==0)
  233. {
  234. return (ostatnio->zawart);
  235. }
  236. else
  237. {
  238. ktory = i;
  239. if ((-j)>i)
  240. {
  241. nasz = minimum(korzen);
  242. for (j=0;j<i;j++)
  243. {
  244. nasz = nastepnik(nasz);
  245. }
  246. ostatnio=nasz;
  247. return (nasz->zawart);
  248. }
  249. else
  250. {
  251. nasz = ostatnio;
  252. for (i=0;i>j;i--)
  253. {
  254. nasz = poprzednik(nasz);
  255. }
  256. ostatnio=nasz;
  257. return (nasz->zawart);
  258. }
  259. }
  260. }
  261. else
  262. {
  263. ktory = i;
  264. nasz = minimum(korzen);
  265. for (j=0;j<i;j++)
  266. {
  267. nasz = nastepnik(nasz);
  268. }
  269. ostatnio=nasz;
  270. return (nasz->zawart);
  271. }
  272. }
  273. template <typename T> T& nodrze<T>::operator[](int i)
  274. {
  275. int j;
  276. wezel<T> * nasz;
  277. if (ostatnio!=NIL)
  278. {
  279. j=i-ktory;
  280. if (j>0)
  281. {
  282. if (j > (ile-i))
  283. {
  284. ktory = i;
  285. i=ile-i-1;
  286. nasz = maksimum(korzen);
  287. for (j=0;j<i;j++)
  288. {
  289. nasz = poprzednik(nasz);
  290. }
  291. ostatnio=nasz;
  292. return *(nasz->zawart);
  293. }
  294. else
  295. {
  296. ktory = i;
  297. nasz = ostatnio;
  298. for (i=0;i<j;i++)
  299. {
  300. nasz = nastepnik(nasz);
  301. }
  302. ostatnio=nasz;
  303. return *(nasz->zawart);
  304. }
  305. }
  306. if (j==0)
  307. {
  308. return *(ostatnio->zawart);
  309. }
  310. else
  311. {
  312. ktory = i;
  313. if ((-j)>i)
  314. {
  315. nasz = minimum(korzen);
  316. for (j=0;j<i;j++)
  317. {
  318. nasz = nastepnik(nasz);
  319. }
  320. ostatnio=nasz;
  321. return *(nasz->zawart);
  322. }
  323. else
  324. {
  325. nasz = ostatnio;
  326. for (i=0;i>j;i--)
  327. {
  328. nasz = poprzednik(nasz);
  329. }
  330. ostatnio=nasz;
  331. return *(nasz->zawart);
  332. }
  333. }
  334. }
  335. else
  336. {
  337. ktory = i;
  338. nasz = minimum(korzen);
  339. for (j=0;j<i;j++)
  340. {
  341. nasz = nastepnik(nasz);
  342. }
  343. ostatnio=nasz;
  344. return *(nasz->zawart);
  345. }
  346. }
  347. template <typename T> bool nodrze<T>::operator+=(T * co)
  348. {
  349. wezel<T> * w = new wezel<T>(NIL);
  350. w->kolor=CZERWONY;
  351. w->zawart = co;
  352. dodajRBT(w);
  353. return true;
  354. }
  355. template <typename T> bool nodrze<T>::operator+=(T co)
  356. {
  357. dodaj(co);
  358. return true;
  359. }
  360. template <typename T> bool nodrze<T>::operator-=(T co)
  361. {
  362. usun(co);
  363. return true;
  364. }
  365. template <typename T> bool nodrze<T>::operator-=(T * co)
  366. {
  367. usun(*co);
  368. return true;
  369. }
  370. template <typename T> T* nodrze<T>::operator%(T * co)
  371. {
  372. wezel<T> * w = szukajIter(korzen,*co);
  373. if (w != NIL)
  374. return w;
  375. else return NULL;
  376. }
  377. template <typename T> bool nodrze<T>::operator&(T co)
  378. {
  379. return czyJest(co);
  380. }
  381. template <typename T> bool nodrze<T>::operator&(T * co)
  382. {
  383. return czyJest(*co);
  384. }
  385. template <typename T> class iterator
  386. {
  387. /*nodrze<T> * dd;
  388. wezel<T> * akt;
  389. public:
  390. T * operator->()
  391. {
  392. return akt->zawart;
  393. }
  394. iterator& operator++()
  395. {
  396. akt = dd->nastepnik(akt);
  397. return this;
  398. }
  399. iterator& operator--()
  400. {
  401. akt = dd->poprzednik(akt);
  402. return this;
  403. }
  404. T * operator=(T*)
  405. {
  406. akt->zawart = T;
  407. return akt->zawart;
  408. }*/
  409. /*void start()
  410. {
  411. akt = maksimum(korzen);
  412. }*/
  413. };
  414. template <typename T> void nodrze<T>::inIt(std::ostream & strum, wezel<T> * wsk)
  415. {
  416. if (wsk == NIL)
  417. return;
  418. // Start from the minimumimum wsk
  419. while (wsk->lewy != NIL)
  420. wsk=wsk->lewy;
  421. do
  422. {
  423. visit(wsk);
  424. // Next in order will be our right child's leftmost child (if NIL, our right child)
  425. if (wsk->prawy != NIL)
  426. {
  427. wsk = wsk->prawy;
  428. while (wsk->lewy != NIL)
  429. wsk = wsk->left;
  430. }
  431. else
  432. {
  433. while (true)
  434. {
  435. if (wsk->ojciec == NIL)
  436. {
  437. wsk = NIL;
  438. break;
  439. }
  440. wsk = wsk->ojciec;
  441. // If wsk is its parents left child, then its parent hasn't been visited yet
  442. if (wsk->ojciec->lewy == wsk)
  443. break;
  444. }
  445. }
  446. }
  447. while (wsk != NIL);
  448. };
  449. template <typename T> bool nodrze<T>::sprawdz()
  450. {
  451. return (sprawdzW(korzen));
  452. };
  453. template <typename T> T * nodrze<T>::znajdz (T co, bool iter)
  454. {
  455. return ((iter)?(szukajIter(korzen,co)->zawart):(szukajRek(korzen,co)->zawart));
  456. };
  457. template <typename T> void nodrze<T>::usun (T co)
  458. {
  459. wezel<T> * w = szukajIter(korzen, co);
  460. usunRBT(w);
  461. delete w;
  462. }
  463. template <typename T> void nodrze<T>::naprawUsun (wezel<T> * x)
  464. {
  465. wezel<T> *w;
  466. while ( (x != korzen) && (x->kolor == CZARNY) )
  467. {
  468. CLOG("6... "<<flush);
  469. if (x == x->ojciec->lewy)
  470. {
  471. CLOG("7... "<<flush);
  472. w = x->ojciec->prawy;
  473. if (w->kolor == CZERWONY)
  474. {
  475. w->kolor = CZARNY;
  476. x->ojciec->kolor = CZERWONY;
  477. rotacjaLewa(x->ojciec);
  478. w = x->ojciec->prawy;
  479. }
  480. CLOG("8... "<<flush);
  481. if ( (w->lewy->kolor == CZARNY) && (w->prawy->kolor == CZARNY) )
  482. {
  483. CLOG("8,1... "<<flush);
  484. w->kolor = CZERWONY;
  485. x = x->ojciec;
  486. }
  487. else
  488. {
  489. CLOG("9... "<<flush);
  490. if (w->prawy->kolor == CZARNY)
  491. {
  492. CLOG("9,1... "<<flush);
  493. w->lewy->kolor = CZARNY;
  494. w->kolor = CZERWONY;
  495. rotacjaPrawa(w);
  496. w = x->ojciec->prawy;
  497. CLOG("9,2... "<<flush);
  498. }
  499. CLOG("9,3... "<<flush);
  500. w->kolor = x->ojciec->kolor;
  501. x->ojciec->kolor = CZARNY;
  502. w->prawy->kolor = CZARNY;
  503. rotacjaLewa(x->ojciec);
  504. x=korzen;
  505. CLOG("9,4... "<<flush);
  506. }
  507. }
  508. else
  509. {
  510. CLOG("10... "<<flush);
  511. w = x->ojciec->lewy;
  512. if (w->kolor == CZERWONY)
  513. {
  514. w->kolor = CZARNY;
  515. x->ojciec->kolor = CZERWONY;
  516. rotacjaPrawa(x->ojciec);
  517. w = x->ojciec->lewy;
  518. }
  519. CLOG("11... "<<flush);
  520. if ( (w->lewy->kolor == CZARNY) && (w->prawy->kolor == CZARNY) )
  521. {
  522. w->kolor = CZERWONY;
  523. x = x->ojciec;
  524. }
  525. else
  526. {
  527. if (w->lewy->kolor == CZARNY)
  528. {
  529. w->prawy->kolor = CZARNY;
  530. w->kolor = CZERWONY;
  531. rotacjaLewa(w);
  532. w = x->ojciec->lewy;
  533. }
  534. w->kolor = x->ojciec->kolor;
  535. x->ojciec->kolor = CZARNY;
  536. w->lewy->kolor = CZARNY;
  537. rotacjaPrawa(x->ojciec);
  538. x=korzen;
  539. CLOG("12... "<<flush);
  540. }
  541. }
  542. }
  543. x->kolor = CZARNY;
  544. CLOG("13... "<<flush);
  545. };
  546. template <typename T> wezel<T> * nodrze<T>::usunRBT (wezel<T> * nowy)
  547. {
  548. CLOG ("Usuwam "<<*nowy->zawart<<std::endl);
  549. ile--;
  550. if ((*nowy->zawart) < (*ostatnio->zawart))
  551. {
  552. ktory--;
  553. CLOG("Ostatnio to "<<(*ostatnio->zawart)<<", czyli teraz "<<(ktory)<<" (mniej) element."<<std::endl);
  554. }
  555. else if (nowy == ostatnio)
  556. {
  557. CLOG ("To był ostatnio oglšdany element. Elementem o numerze "<<ktory<<" bedzie teraz ");
  558. if (ktory < ile)
  559. {
  560. ostatnio = nastepnik(ostatnio);
  561. }
  562. else
  563. {
  564. CLOG ("Ojej, koniec. Cofamy się. "<<std::endl);
  565. ostatnio = poprzednik(ostatnio);
  566. ktory--;
  567. }
  568. CLOG(*ostatnio->zawart<<std::endl);
  569. }
  570. CLOG("1... "<<flush);
  571. wezel<T> *y, *x;
  572. if ( (nowy->lewy == NIL) || (nowy->prawy == NIL) )
  573. y=nowy;
  574. else y = nastepnik(nowy);
  575. CLOG("2... "<<flush);
  576. if (y->lewy != NIL)
  577. x = y->lewy;
  578. else x = y->prawy;
  579. x->ojciec = y->ojciec;
  580. CLOG("3... "<<flush);
  581. if (y->ojciec == NIL)
  582. korzen = x;
  583. else if (y == y->ojciec->lewy)
  584. y->ojciec->lewy = x;
  585. else
  586. y->ojciec->prawy = x;
  587. CLOG("4... "<<flush);
  588. if (y != nowy)
  589. (*nowy) = (*y); // skopiowanie
  590. CLOG("5... "<<flush);
  591. if (y->kolor == CZARNY)
  592. naprawUsun(x);
  593. CLOG ("koniec usuwania"<<std::endl);
  594. return y;
  595. };
  596. template <typename T> void nodrze<T>::naprawWstaw (wezel<T> * nowy)
  597. {
  598. //CLOG ("Naprawiam po wstawieniu"<<std::endl);
  599. while (nowy->ojciec->kolor==CZERWONY)
  600. {
  601. if (nowy->ojciec == nowy->ojciec->ojciec->lewy) // ojciec nowego lest lewy
  602. {
  603. wezel<T> * y = nowy->ojciec->ojciec->prawy;
  604. if (y->kolor == CZERWONY) // a stryj jest czerwony
  605. {
  606. nowy->ojciec->kolor = CZARNY;
  607. y->kolor = CZARNY;
  608. nowy->ojciec->ojciec->kolor = CZERWONY;
  609. nowy = nowy->ojciec->ojciec;
  610. }
  611. else
  612. {
  613. if (nowy->ojciec->prawy == nowy) // nowy jest prawym synem
  614. {
  615. nowy = nowy->ojciec;
  616. rotacjaLewa(nowy);
  617. }
  618. nowy->ojciec->kolor=CZARNY;
  619. nowy->ojciec->ojciec->kolor=CZERWONY;
  620. rotacjaPrawa(nowy->ojciec->ojciec);
  621. }
  622. }
  623. else
  624. {
  625. wezel<T> * y = nowy->ojciec->ojciec->lewy;
  626. if (y->kolor == CZERWONY) // a stryj jest czerwony
  627. {
  628. nowy->ojciec->kolor = CZARNY;
  629. y->kolor = CZARNY;
  630. nowy->ojciec->ojciec->kolor = CZERWONY;
  631. nowy = nowy->ojciec->ojciec;
  632. }
  633. else
  634. {
  635. if (nowy->ojciec->lewy == nowy)
  636. {
  637. nowy = nowy->ojciec;
  638. rotacjaPrawa(nowy);
  639. }
  640. nowy->ojciec->kolor=CZARNY;
  641. nowy->ojciec->ojciec->kolor=CZERWONY;
  642. rotacjaLewa(nowy->ojciec->ojciec);
  643. }
  644. }
  645. }
  646. korzen->kolor = CZARNY;
  647. }
  648. template <typename T> void nodrze<T>::dodajRBT (wezel<T> * nowy)
  649. {
  650. //CLOG("Dodaje do drzewa "<<nowy->zawart<<std::endl);
  651. ile++;
  652. if ((*nowy->zawart) < (*ostatnio->zawart))
  653. {
  654. ktory++;
  655. }
  656. wezel<T> * y =NIL, * x = korzen;
  657. while (x != NIL)
  658. {
  659. y=x;
  660. if ((*nowy->zawart) < (*x->zawart))
  661. x=x->lewy;
  662. else x = x->prawy;
  663. }
  664. nowy->ojciec = y;
  665. if (y == NIL)
  666. {
  667. korzen=nowy;
  668. ostatnio=korzen;
  669. ktory=0;
  670. }
  671. else if ((*nowy->zawart) < (*y->zawart))
  672. y->lewy = nowy;
  673. else y->prawy = nowy;
  674. nowy->kolor = CZERWONY;
  675. naprawWstaw(nowy);
  676. };
  677. template <typename T> void nodrze<T>::dodaj (T co)
  678. {
  679. wezel<T> * w = new wezel<T>(NIL);
  680. w->lewy=w->prawy=w->ojciec=NIL;
  681. w->zawart = new T(co);
  682. dodajRBT(w);
  683. }
  684. template <typename T> void nodrze<T>::zepsuj()
  685. {
  686. int pom;
  687. pom = *korzen->zawart;
  688. *korzen->zawart = *korzen->prawy->zawart;
  689. *korzen->prawy->zawart = pom;
  690. }
  691. template <typename T> bool nodrze<T>::czyBST (wezel<T> * w)
  692. {
  693. if (w->prawy != NIL)
  694. {
  695. if ((*w->prawy->zawart) < (*w->zawart))
  696. return false;
  697. }
  698. if (w->lewy != NIL)
  699. {
  700. if((*w->lewy->zawart) > (*w->zawart))
  701. return false;
  702. }
  703. return true;
  704. }
  705. template <typename T> bool nodrze<T>::sprawdzW(wezel<T> * w)
  706. {
  707. bool ret = czyBST(w);
  708. if (w->prawy != NIL)
  709. ret&=sprawdzW(w->prawy);
  710. if (w->lewy != NIL)
  711. ret&=sprawdzW(w->lewy);
  712. return ret;
  713. }
  714. template <typename T> void nodrze<T>::rotacjaLewa (wezel<T> * x)
  715. {
  716. //CLOG("Wykonuje lewš rotację na "<<x->zawart<<std::endl);
  717. wezel<T> * y = x->prawy;
  718. x->prawy = y->lewy; // zamiana lewego poddrzewa y na prawe poddrzewo x
  719. if (y->lewy != NIL) y->lewy->ojciec = x; // i przypisanie ojcostwa temu poddrzewu
  720. y->ojciec = x->ojciec; // ojcem y bedzie ojciec x
  721. if (x->ojciec == NIL)
  722. korzen = y;
  723. else if ((x->ojciec->lewy) == x)
  724. x->ojciec->lewy = y;
  725. else
  726. x->ojciec->prawy = y;
  727. y->lewy = x; // a x bedzie lewym synem y
  728. x->ojciec = y;
  729. };
  730. template <typename T> void nodrze<T>::rotacjaPrawa (wezel<T> * y)
  731. {
  732. //CLOG("Wykonuje prawa rotację na "<<y->zawart<<std::endl);
  733. wezel<T> * x = y->lewy;
  734. y->lewy = x->prawy; // zamiana prawe poddrzewa x na lewe poddrzewo y
  735. if (x->prawy != NIL) x->prawy->ojciec = y; // i przypisanie ojcostwa temu poddrzewu
  736. x->ojciec = y->ojciec; // ojcem x bedzie ojciec y
  737. if (x->ojciec == NIL)
  738. korzen = x;
  739. else if ((y->ojciec->lewy) == y)
  740. y->ojciec->lewy = x;
  741. else
  742. y->ojciec->prawy = x;
  743. x->prawy = y; // a y bedzie prawym synem x
  744. y->ojciec = x;
  745. };
  746. template <typename T> T * nodrze<T>::nast(T czego)
  747. {
  748. wezel<T> * w = szukajIter(korzen,czego);
  749. if (w != NIL)
  750. w = nastepnik(w);
  751. else throw std::exception("Nie znaleziono wartosci");
  752. if (w != NIL)
  753. return (w->zawart);
  754. else throw std::exception("Nie znaleziono nastepnika");
  755. };
  756. template <typename T> bool nodrze<T>::czyJest(T co)
  757. {
  758. if ( szukajIter(korzen,co) != NIL )
  759. return true;
  760. else return false;
  761. }
  762. template <typename T> wezel<T> * nodrze<T>::szukajRek(wezel<T> * w, T co)
  763. {
  764. if (w==NIL || (*w->zawart)==co)
  765. return w;
  766. if (co < (*w->zawart))
  767. return szukajRek(w->lewy,co);
  768. else return szukajRek(w->prawy,co);
  769. };
  770. template <typename T> wezel<T> * nodrze<T>::szukajIter(wezel<T> * w, T co)
  771. {
  772. while (w!=NIL && (*w->zawart)!=co)
  773. {
  774. if (co < (*w->zawart))
  775. w=w->lewy;
  776. else w=w->prawy;
  777. }
  778. return w;
  779. };
  780. template <typename T> wezel<T> * nodrze<T>::minimum(wezel<T> * w)
  781. {
  782. while (w->lewy != NIL)
  783. w=w->lewy;
  784. return w;
  785. };
  786. template <typename T> wezel<T> * nodrze<T>::maksimum(wezel<T> * w)
  787. {
  788. while (w->prawy != NIL)
  789. w=w->prawy;
  790. return w;
  791. };
  792. template <typename T> wezel<T> * nodrze<T>::nastepnik(wezel<T> * w)
  793. {
  794. if (w->prawy != NIL)
  795. return minimum(w->prawy);
  796. wezel<T> * y = w->ojciec;
  797. while (y!= NIL && w == y->prawy)
  798. {
  799. w=y;
  800. y=y->ojciec;
  801. }
  802. return y;
  803. };
  804. template <typename T> wezel<T> * nodrze<T>::poprzednik(wezel<T> * w)
  805. {
  806. if (w->lewy != NIL)
  807. return maksimum(w->lewy);
  808. wezel<T> * y = w->ojciec;
  809. while (y!= NIL && w == y->lewy)
  810. {
  811. w=y;
  812. y=y->ojciec;
  813. }
  814. return y;
  815. };
  816. template <typename T> T * nodrze<T>::maksimumimum ()
  817. {
  818. wezel<T> * ret = maksimum(korzen);
  819. if (ret != NIL)
  820. return (ret->zawart);
  821. else throw std::exception("Drzewo jest puste");
  822. };
  823. template <typename T> T * nodrze<T>::minimumimum ()
  824. {
  825. wezel<T> * ret = minimum(korzen);
  826. if (ret != NIL)
  827. return (ret->zawart);
  828. else throw std::exception("Drzewo jest puste");
  829. };
  830. template <typename T> void nodrze<T>::inorder(std::ostream & strum)
  831. {
  832. in(strum,korzen);
  833. }
  834. template <typename T> void nodrze<T>::preorder(std::ostream & strum)
  835. {
  836. pre(strum,korzen);
  837. }
  838. template <typename T> void nodrze<T>::postorder(std::ostream & strum)
  839. {
  840. post(strum,korzen);
  841. }
  842. template <typename T> void nodrze<T>::in(std::ostream & strum, wezel<T> * wsk)
  843. {
  844. if (wsk==NIL)
  845. return;
  846. if (wsk->lewy != NIL)
  847. in(strum,wsk->lewy);
  848. strum << *wsk->zawart<<"\t";
  849. if (wsk->prawy != NIL)
  850. in(strum,wsk->prawy);
  851. };
  852. template <typename T> void nodrze<T>::post(std::ostream & strum, wezel<T> * wsk)
  853. {
  854. if (wsk==NIL)
  855. return;
  856. if (wsk->lewy != NIL)
  857. post(strum,wsk->lewy);
  858. if (wsk->prawy != NIL)
  859. post(strum,wsk->prawy);
  860. strum << *wsk->zawart<<"\t";
  861. };
  862. template <typename T> void nodrze<T>::pre(std::ostream & strum, wezel<T> * wsk)
  863. {
  864. if (wsk == NIL)
  865. return;
  866. strum << *wsk->zawart<<"\t";
  867. if (wsk->lewy != NIL)
  868. pre(strum,wsk->lewy);
  869. if (wsk->prawy != NIL)
  870. pre(strum,wsk->prawy);
  871. };
  872. #endif //_NODRZE_H