Advertisement
ithoran

Struk Lab 5

May 8th, 2016
302
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.06 KB | None | 0 0
  1. // Cvor.h
  2. #pragma once
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. class Cvor {
  7. public:
  8.     int info;
  9.     Cvor* levo;
  10.     Cvor* desno;
  11.     Cvor() {
  12.         info = 0;
  13.         levo = 0;
  14.         desno = 0;
  15.     }
  16.     Cvor(int x) {
  17.         info = x;
  18.         levo = 0;
  19.         desno = 0;
  20.     }
  21. };
  22.  
  23. // Stablo.h
  24. #pragma once
  25. #include "Header.h"
  26.  
  27. class Stablo {
  28.     Cvor* root;
  29.     int num;
  30.     void brisac(Cvor* a);
  31.     Cvor* trazi(Cvor* a, Cvor& x);
  32.     Cvor* trazi(Cvor* a, int x);
  33.     void preOrder(Cvor* a);
  34.     Cvor* preOrderOgledalo(Cvor* a, Cvor* b); // WIP
  35. public:
  36.     Stablo();
  37.     Stablo(Cvor& a);
  38.     ~Stablo();
  39.     void insert(int x);
  40.     Cvor* parent(Cvor& a);
  41.     Cvor* sister(Cvor& a);
  42.     bool isLeft(Cvor& a);
  43.     bool isRight(Cvor& a);
  44.     void deleteEl(int x);
  45.     void stampaj();
  46.     Cvor* trazi(int x);
  47.     Stablo* ogledalo();  // WIP
  48. };
  49.  
  50. // Stablo.cpp
  51. #pragma once
  52. #include "Stablo.h"
  53.  
  54. Stablo::Stablo() {
  55.     root = 0;
  56.     num = 0;
  57. }
  58.  
  59. Stablo::Stablo(Cvor& a) {
  60.     root = &a;
  61.     num = 1;
  62. }
  63.  
  64. Stablo::~Stablo() {
  65.     if (root != 0) {
  66.         brisac(root);
  67.         delete root;
  68.     }
  69. }
  70.  
  71. void Stablo::brisac(Cvor* a) {
  72.     if (a->levo != 0)
  73.         brisac(a->levo);
  74.     if (a->desno != 0)
  75.         brisac(a->desno);
  76.     delete a->levo;
  77.     delete a->desno;
  78. }
  79.  
  80. Cvor* Stablo::parent(Cvor& a) {
  81.     return trazi(root, a);
  82. }
  83.  
  84. Cvor* Stablo::sister(Cvor& a) {
  85.     Cvor* tmp = parent(a);
  86.     if (tmp->levo == &a)
  87.         return tmp->desno;
  88.     else
  89.         return tmp->levo;
  90. }
  91.  
  92. void Stablo::preOrder(Cvor* a) {
  93.     if (a == 0)
  94.         return;
  95.     cout << a->info << " ";
  96.     preOrder(a->levo);
  97.     preOrder(a->desno);
  98. }
  99.  
  100. Cvor* Stablo::trazi(Cvor* a, int x) {
  101.     Cvor* tmp = a;
  102.     while (tmp != 0) {
  103.         if (tmp->info == x)
  104.             return tmp;
  105.         if (tmp->info < x)
  106.             tmp = tmp->desno;
  107.         else
  108.             tmp = tmp->levo;
  109.     }
  110.     return 0;
  111.     /*if (a == 0)
  112.         return 0;
  113.     if (a->info == x)
  114.         return a;
  115.     Cvor* x1 = trazi(a->levo, x);
  116.     if (x1 != 0)
  117.         return x1;
  118.     Cvor* x2 = trazi(a->desno, x);
  119.     if (x2 != 0)
  120.         return x2;
  121.     return 0;
  122.  
  123.     /*Cvor* tmp = a;
  124.     while (tmp != 0) {
  125.         if (tmp->info == x)
  126.             return tmp;
  127.         if (tmp->levo != 0)
  128.             tmp = tmp->levo;
  129.         else
  130.             tmp = tmp->desno;
  131.     }*/
  132. }
  133.  
  134. Cvor* Stablo::trazi(Cvor* a, Cvor& x) { //MOZDA NE VALJA
  135.     if (a == 0)
  136.         return 0;
  137.     if (a->levo == &x || a->desno == &x)
  138.         return a;
  139.     Cvor* x1 = trazi(a->levo, x);
  140.     if (x1 != 0)
  141.         return x1;
  142.     Cvor* x2 = trazi(a->desno, x);
  143.     if (x2 != 0)
  144.         return x2;
  145.     return 0;
  146. };
  147.  
  148. Cvor* Stablo::trazi(int x) {
  149.     return trazi(root, x);
  150. }
  151.  
  152. void Stablo::insert(int x) {
  153.     Cvor* tmp = root;
  154.     Cvor* prev = 0;
  155.     while (tmp != 0) {
  156.         prev = tmp;
  157.         if (tmp->info < x)
  158.             tmp = tmp->desno;
  159.         else
  160.             tmp = tmp->levo;
  161.     }
  162.     if (root == 0)
  163.         root = new Cvor(x);
  164.     else
  165.         if (prev->info < x)
  166.             prev->desno = new Cvor(x);
  167.         else
  168.             prev->levo = new Cvor(x);
  169.     num++;
  170. }
  171.  
  172. bool Stablo::isLeft(Cvor& a) {
  173.     Cvor* tmp = parent(a);
  174.     if (tmp->levo == &a)
  175.         return true;
  176.     else
  177.         return false;
  178. }
  179.  
  180. bool Stablo::isRight(Cvor& a) {
  181.     Cvor* tmp = parent(a);
  182.     if (tmp->desno == &a)
  183.         return true;
  184.     else
  185.         return false;
  186. }
  187.  
  188. void Stablo::deleteEl(int x) {
  189.     Cvor* brisi = trazi(root, x);
  190.     Cvor* brisiP = parent(*brisi);
  191.     if (brisi->levo == 0 && brisi->desno == 0) {
  192.         brisiP->levo = 0;
  193.         brisiP->desno = 0;
  194.         delete brisi;
  195.         num--;
  196.         return;
  197.     }
  198.     if (brisi->levo == 0) {
  199.         if (brisiP->levo == brisi)
  200.             brisiP->levo = brisi->desno;
  201.         else
  202.             brisiP->desno = brisi->desno;
  203.         delete brisi;
  204.         num--;
  205.         return;
  206.     }
  207.     if (brisi->desno == 0) {
  208.         if (brisiP->levo == brisi)
  209.             brisiP->levo = brisi->levo;
  210.         else
  211.             brisiP->desno = brisi->levo;
  212.         delete brisi;
  213.         num--;
  214.         return;
  215.     }
  216.     Cvor* tmp = brisi->levo;
  217.     Cvor* prev = 0;
  218.     while (tmp != 0) {
  219.         prev = tmp;
  220.         tmp = tmp->desno;
  221.     }
  222.     if (prev == brisi->levo) {                // poseeban slucaj
  223.         if (brisiP->levo == brisi)
  224.             brisiP->levo = prev;
  225.         else
  226.             brisiP->desno = prev;
  227.         prev->desno = brisi->desno;
  228.         delete brisi;
  229.         num--;
  230.         return;
  231.     }
  232.     if (prev->levo != 0) {
  233.         parent(*prev)->desno = prev->levo;
  234.     }
  235.     if (brisiP->levo == brisi)
  236.         brisiP->levo = prev;
  237.     else
  238.         brisiP->desno = prev;
  239.     delete brisi;
  240.     num--;
  241. }
  242.  
  243. void Stablo::stampaj() {
  244.     preOrder(root);
  245.     cout << endl;
  246. }
  247.  
  248. Cvor* Stablo::preOrderOgledalo(Cvor* a, Cvor* b) {
  249.     b = new Cvor(a->info);
  250.     if (root == 0)
  251.         root = b;
  252.     if (a->desno != 0)
  253.         b->levo = preOrderOgledalo(a->desno, b->levo);
  254.     if (a->levo != 0)
  255.         b->desno = preOrderOgledalo(a->levo, b->desno);
  256.     return b;
  257. }
  258.  
  259.  
  260. Stablo* Stablo::ogledalo() {
  261.     Stablo* s = new Stablo;
  262.     s->preOrderOgledalo(root, s->root);
  263.     return s;
  264. }
  265.  
  266. // mejn
  267. #include "Stablo.h"
  268. #include "Header.h"
  269.  
  270. void main() {
  271.     Stablo drvo;
  272.     drvo.insert(7);
  273.     drvo.insert(3);
  274.     drvo.insert(2);
  275.     drvo.insert(8);
  276.     drvo.insert(9);
  277.     drvo.insert(5);
  278.     drvo.insert(1);
  279.     drvo.insert(4);
  280.     drvo.stampaj();
  281.     drvo.deleteEl(5);
  282.     drvo.stampaj();
  283.     Cvor* pom = drvo.trazi(4);
  284.     if (drvo.isLeft(*pom))
  285.         cout << "JESTE\n";
  286.     else
  287.         cout << "NIJE\n";
  288.     pom = drvo.trazi(4);
  289.     if (drvo.isLeft(*pom))
  290.         cout << "JESTE\n";
  291.     else
  292.         cout << "NIJE\n";
  293.     pom = drvo.trazi(4);
  294.     if (drvo.isRight(*pom))
  295.         cout << "JESTE\n";
  296.     else
  297.         cout << "NIJE\n";
  298.     Stablo* pok = drvo.ogledalo();
  299.     pok->stampaj();
  300.     delete pok;
  301. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement