nodrze.h 21 KB

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