nodrze.h 22 KB

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