nodrze.h 22 KB

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