nodrze.h 21 KB

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