nodrze.h 22 KB

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