Advertisement
Adijata

od_do

Jan 15th, 2015
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.13 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdexcept>
  3. #include <vector>
  4.  
  5.  
  6. using namespace std;
  7.  
  8. template <typename Tip1, typename Tip2>
  9. class Cvor
  10. {
  11. public:
  12. Cvor()
  13. {
  14. lijevo=desno=roditelj=0;
  15. }
  16. Cvor (const Tip1& klj, const Tip2 &el, Cvor* l, Cvor *r, Cvor* parent)
  17. {
  18. kljuc=klj;
  19. element=el;
  20. lijevo=l;
  21. desno=r;
  22. roditelj=parent;
  23. }
  24. Tip1 kljuc;
  25. Tip2 element;
  26. Cvor* lijevo, *desno, *roditelj;
  27. };
  28.  
  29. template <typename Tip1, typename Tip2>
  30. class BinStabloMapa
  31. {
  32. int brojEL;
  33. Cvor<Tip1, Tip2>* Korijen;
  34.  
  35. Cvor<Tip1, Tip2> * Trazi(Cvor<Tip1, Tip2> *r, const Tip1 &x)const
  36. {
  37. if(r==0 || r->kljuc==x )
  38. return r;
  39. else if (x < r->kljuc)
  40. return Trazi(r->lijevo, x);
  41. else
  42. return Trazi(r->desno, x);
  43. }
  44.  
  45.  
  46. Cvor<Tip1, Tip2> * TraziPot(Cvor<Tip1, Tip2> *r, const Tip1 &x)const
  47. {
  48. if(r->lijevo && x < r->kljuc)
  49. return TraziPot(r->lijevo, x);
  50. else if(r->desno && x> r->kljuc)
  51. return TraziPot(r->desno, x);
  52. else return r;
  53. }
  54.  
  55. Cvor<Tip1, Tip2>* pomocnaAlociraj(Cvor<Tip1, Tip2> * C)
  56. {
  57. if (C==0)
  58. return 0;
  59. Cvor<Tip1, Tip2> *novi=new Cvor<Tip1, Tip2>();
  60. novi->kljuc=C->kljuc;
  61. novi->element=C->element;
  62. return novi;
  63. }
  64.  
  65. void pomocnaKonstruktor(Cvor<Tip1, Tip2> * C1, Cvor<Tip1, Tip2> * C2)
  66. {
  67. if (C1==0) return;
  68. C2->desno = pomocnaAlociraj(C1->desno);
  69. C2->lijevo = pomocnaAlociraj(C1->lijevo);
  70. if (C2->desno)
  71. C2->desno->roditelj = C2;
  72. if (C2->lijevo)
  73. C2->lijevo->roditelj = C2;
  74. pomocnaKonstruktor(C1->desno, C2->desno);
  75. pomocnaKonstruktor(C1->lijevo, C2->lijevo);
  76.  
  77. }
  78. void Brisi(Cvor<Tip1, Tip2>* Temp)
  79. {
  80. if(Temp)
  81. {
  82. Brisi(Temp->lijevo);
  83. Brisi(Temp->desno);
  84.  
  85. delete Temp;
  86. }
  87.  
  88. }
  89.  
  90. Cvor<Tip1, Tip2>* pomocnaKonstruktor1(const Tip1 *nizKljuceva, const Tip2 *nizVrijednosti, int prva, int druga, bool grana=true)
  91. {
  92. if(prva==druga)
  93. {
  94. Cvor<Tip1, Tip2>* novi= new Cvor<Tip1, Tip2>();
  95. novi->kljuc=nizKljuceva[prva];
  96. novi->element=nizVrijednosti[prva];
  97. return novi;
  98. }
  99. else if(prva+1==druga)
  100. {
  101. Cvor<Tip1, Tip2> *novi1= new Cvor<Tip1, Tip2>();
  102. Cvor<Tip1, Tip2> *novi2= new Cvor<Tip1, Tip2>();
  103. novi1->kljuc=nizKljuceva[prva];
  104. novi1->element=nizVrijednosti[prva];
  105. novi2->kljuc=nizKljuceva[druga];
  106. novi2->element=nizKljuceva[druga];
  107. if(grana)
  108. {
  109. novi2->lijevo=novi1;
  110. novi1->roditelj=novi2;
  111. return novi2;
  112. }
  113. else
  114. {
  115. novi1->desno=novi2;
  116. novi2->roditelj=novi1;
  117. return novi1;
  118. }
  119.  
  120. }
  121.  
  122. if(prva+1<druga)
  123. {
  124. int sredina=(prva+druga)/2;
  125. int druga2=sredina-1;
  126. int prva2=sredina+1;
  127. Cvor<Tip1,Tip2>* glavni=new Cvor<Tip1, Tip2>();
  128. Cvor<Tip1,Tip2>* lijevi=new Cvor<Tip1, Tip2>();
  129. Cvor<Tip1,Tip2>* desni=new Cvor<Tip1, Tip2>();
  130. glavni->kljuc=nizKljuceva[sredina];
  131. glavni->element=nizVrijednosti[sredina];
  132.  
  133. lijevi=pomocnaKonstruktor1(nizKljuceva,nizVrijednosti, prva, druga2, true);
  134. desni=pomocnaKonstruktor1(nizKljuceva,nizVrijednosti, prva2, druga, false);
  135. lijevi->roditelj=glavni;
  136. desni->roditelj=glavni;
  137. glavni->lijevo=lijevi;
  138. glavni->desno=desni;
  139. return glavni;
  140.  
  141. }
  142. else
  143. return 0;
  144.  
  145. }
  146.  
  147. Cvor<Tip1, Tip2>* Minimum(Cvor<Tip1, Tip2>* c )
  148. {
  149. Cvor<Tip1, Tip2>* Temp=c;
  150.  
  151. while(Temp->lijevo)
  152. {
  153. Temp=Temp->lijevo;
  154. }
  155.  
  156. return Temp;
  157. }
  158.  
  159. Cvor<Tip1, Tip2>* Maksimum(Cvor<Tip1, Tip2>* c)
  160. {
  161. Cvor<Tip1, Tip2>* Temp=c;
  162.  
  163. while(Temp->desno)
  164. {
  165. Temp=Temp->desno;
  166. }
  167.  
  168. return Temp;
  169. }
  170. public:
  171. BinStabloMapa()
  172. {
  173. Korijen= 0;
  174. brojEL=0;
  175. }
  176.  
  177. ~BinStabloMapa()
  178. {
  179. if(brojEL!=0)
  180. Brisi(Korijen);
  181.  
  182. }
  183.  
  184.  
  185. Tip2& operator[](Tip1 kljuc)
  186. {
  187. Cvor<Tip1, Tip2> *Temp, *Novi;
  188. if (brojEL == 0)
  189. {
  190. Novi= new Cvor<Tip1, Tip2>();
  191. Novi->kljuc=kljuc;
  192. Korijen = Novi;
  193. brojEL++;
  194. }
  195. else
  196. {
  197. Temp = Trazi(Korijen, kljuc);
  198.  
  199. if (Temp)
  200. return Temp->element;
  201. Cvor<Tip1, Tip2> *Roditelj;
  202. bool zadnjeLijevo = false;
  203. Temp = Korijen;
  204. while(Temp!=0)
  205. {
  206. Roditelj = Temp;
  207.  
  208. if(Temp->kljuc > kljuc)
  209. {
  210. Temp=Temp->lijevo;
  211. zadnjeLijevo = true;
  212. }
  213. else
  214. {
  215. Temp=Temp->desno;
  216. zadnjeLijevo = false;
  217. }
  218. }
  219.  
  220. Novi= new Cvor<Tip1, Tip2>();
  221. Novi->kljuc=kljuc;
  222. Novi->roditelj = Roditelj;
  223.  
  224. if (zadnjeLijevo)
  225. Roditelj->lijevo = Novi;
  226. else
  227. Roditelj->desno = Novi;
  228.  
  229. brojEL++;
  230. }
  231. Novi->element = Tip2();
  232.  
  233. return Novi->element;
  234.  
  235. }
  236. Tip2 operator[](Tip1 kljuc)const
  237. {
  238. Cvor<Tip1, Tip2>* Temp=Trazi(Korijen,kljuc);
  239. if(!Temp) return Tip2();
  240. return Temp->element;
  241. }
  242.  
  243. int brojElemenata()const
  244. {
  245. return brojEL;
  246. }
  247.  
  248. void obrisi()
  249. {
  250. Brisi(Korijen);
  251. Korijen = 0;
  252. brojEL=0;
  253. }
  254.  
  255. void obrisi(const Tip1& kljuc)
  256. {
  257. Cvor<Tip1, Tip2>* Temp = Trazi(Korijen, kljuc);
  258. Cvor<Tip1, Tip2>* it=Temp;
  259.  
  260. if(it->roditelj==0)
  261. {
  262. if (it->desno && it->lijevo)
  263. {
  264. it = it->desno;
  265.  
  266. while (it->lijevo)
  267. it=it->lijevo;
  268.  
  269. if (it->desno)
  270. {
  271. it->desno->roditelj = it->roditelj;
  272. it->roditelj->lijevo = it->desno;
  273. it->desno = 0;
  274. }
  275.  
  276. it->roditelj = 0;
  277. }
  278. else if (it->desno)
  279. {
  280. it = it->desno;
  281. it->roditelj = 0;
  282. Korijen = it;
  283.  
  284. delete Temp;
  285. brojEL--;
  286. return;
  287. }
  288. else if (it->lijevo)
  289. {
  290. it = it->lijevo;
  291. it->roditelj = 0;
  292. Korijen = it;
  293.  
  294. delete Temp;
  295. brojEL--;
  296. return;
  297. }
  298. else
  299. {
  300. Brisi(Korijen);
  301. brojEL = 0;
  302. return;
  303. }
  304.  
  305. Temp->kljuc = it->kljuc;
  306. Temp->element = it->element;
  307.  
  308. brojEL --;
  309. return;
  310. }
  311. else
  312. {
  313. if (it->desno && it->lijevo)
  314. {
  315. it = it->desno;
  316.  
  317. while (it->lijevo)
  318. it=it->lijevo;
  319.  
  320. if (it->desno)
  321. {
  322. it->desno->roditelj = it->roditelj;
  323. it->roditelj->lijevo = it->desno;
  324. it->desno = 0;
  325. }
  326.  
  327. it->roditelj = 0;
  328.  
  329. Temp->kljuc = it->kljuc;
  330. Temp->element = it->element;
  331.  
  332. brojEL --;
  333. return;
  334. }
  335. else if (it->desno)
  336. {
  337. it = it->desno;
  338. it->roditelj=Temp->roditelj;
  339. }
  340. else if (it->lijevo)
  341. {
  342. it = it->lijevo;
  343. it->roditelj= Temp->roditelj;
  344. }
  345. else
  346. {
  347. if(Temp->roditelj->lijevo == Temp)
  348. Temp->roditelj->lijevo=0;
  349. else
  350. Temp->roditelj->desno=0;
  351.  
  352. delete Temp;
  353. brojEL --;
  354. return;
  355. }
  356.  
  357. if(Temp->roditelj->lijevo == Temp)
  358. Temp->roditelj->lijevo=it;
  359. else
  360. Temp->roditelj->desno=it;
  361.  
  362. delete Temp;
  363. brojEL--;
  364. }
  365.  
  366.  
  367. }
  368.  
  369. BinStabloMapa(const BinStabloMapa &B)
  370. {
  371. Korijen=pomocnaAlociraj(B.Korijen);
  372. pomocnaKonstruktor(B.Korijen, Korijen);
  373. brojEL=B.brojEL;
  374. }
  375. BinStabloMapa &operator =(const BinStabloMapa &B)
  376. {
  377. if(&B != this)
  378. {
  379. if (brojEL)
  380. Brisi(Korijen);
  381. Korijen=pomocnaAlociraj(B.Korijen);
  382. pomocnaKonstruktor(B.Korijen, Korijen);
  383.  
  384. brojEL=B.brojEL;
  385. }
  386. return *this;
  387. }
  388.  
  389.  
  390.  
  391.  
  392. bool operator<(const BinStabloMapa<Tip1, Tip2> b2)
  393. {
  394.  
  395. Cvor<Tip1, Tip2>* Temp1=Maksimum(Korijen);
  396. Cvor<Tip1, Tip2>* Temp2=Minimum(b2.Korijen);
  397. if(Temp1->kljuc < Temp2->kljuc)
  398. return true;
  399.  
  400. return false;
  401. }
  402.  
  403. bool operator>(const BinStabloMapa<Tip1, Tip2> b2)
  404. {
  405.  
  406. Cvor<Tip1, Tip2>* Temp1=Minimum(Korijen);
  407. Cvor<Tip1, Tip2>* Temp2=Maksimum(b2.Korijen);
  408. if(Temp1->kljuc > Temp2->kljuc)
  409. return true;
  410.  
  411. return false;
  412. }
  413.  
  414.  
  415. BinStabloMapa (const Tip1 *nizKljuceva, const Tip2 *nizVrijednosti, int vel)
  416. {
  417. Korijen=pomocnaKonstruktor1(nizKljuceva, nizVrijednosti, 0, vel-1);
  418. this->brojEL=vel;
  419.  
  420. }
  421.  
  422. Tip2 prviManji(Tip1 kljuc)
  423. {
  424. if(kljuc <= Minimum(Korijen)->kljuc) throw "nema finte";
  425. Cvor<Tip1, Tip2> * nadjeni;
  426. nadjeni=Trazi(Korijen,kljuc);//ispravljena funkciaj upotpunosti jer niej nikako radila dobro
  427. if(!nadjeni)
  428. {
  429. nadjeni=TraziPot(Korijen, kljuc);
  430. if(!nadjeni)
  431. throw "dfsgh";
  432. }
  433. else
  434. {
  435. if(nadjeni->lijevo) // ovo se uopste nije provjeravalo, odnosno jest, ali ako je nadjeni->Lijevo nullptr bacala sam izuzetak
  436. return Maksimum(nadjeni->lijevo)->element;
  437. else
  438. {
  439. while(nadjeni->roditelj->kljuc > kljuc)
  440. nadjeni=nadjeni->roditelj;
  441. nadjeni= nadjeni->roditelj; // a treba ovaj dodatni kod uraditi, jer stablo nije balansirano
  442. if(nadjeni==0) throw "nadfi";
  443. }
  444.  
  445. }
  446. return nadjeni->element;
  447. }
  448.  
  449. void pomocna(Tip1 a, Tip1 b, vector<Tip1> &v, Cvor<Tip1,Tip2> *c)
  450. {
  451. if(!c) return;
  452. if(c->kljuc < b) pomocna(a,b,v,c->desno);
  453. if(c->kljuc < b && c->kljuc > a) v.push_back(c->kljuc);
  454. if(c->kljuc > a) pomocna(a,b,v,c->lijevo);
  455. }
  456. vector <Tip1> od_doo(Tip1 a, Tip1 b)
  457. {
  458. vector<Tip1> v;
  459. Cvor<Tip1,Tip2>* c=Korijen;
  460. pomocna(a,b,v, c);
  461. return v;
  462.  
  463. }
  464.  
  465. template <typename Tip>
  466. friend void bin_stablo_sort(Tip*, int );
  467. };
  468. template <typename Tip1>
  469. void inorder(int &i, Tip1* niz, Cvor<Tip1, int>* C)
  470. {
  471. if(C)
  472. {
  473. inorder(i, niz, C->lijevo);
  474. niz[i++]=C->kljuc;
  475. inorder(i, niz, C->desno);
  476. }
  477.  
  478. }
  479.  
  480. template <typename Tip>
  481. void bin_stablo_sort(Tip* niz, int vel)
  482. {
  483. BinStabloMapa<Tip,int> b;
  484. for(int i=0; i<vel; i++)
  485. {
  486. b[niz[i]]=0;
  487. }
  488. int i=0;
  489. inorder(i,niz, b.Korijen);
  490. }
  491.  
  492.  
  493. int main()
  494. {
  495. BinStabloMapa<int,int> b;
  496. b[15]=15;
  497. b[17]=17;
  498. b[13]=13;
  499. b[18]=18;
  500. b[10]=10;
  501. b[8]=8;
  502.  
  503. vector<int> v=b.od_doo(8,17);
  504. for(int i = 0; i < v.size(); i ++)
  505. cout << v[i] << " ";
  506. return 0;
  507. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement