nodrze.h 22 KB

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