nodrze.h 22 KB

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