Advertisement
Karolina99

BST tree

Nov 19th, 2019
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.53 KB | None | 0 0
  1. /**PROTECTED - Modyfikator dostępu, określający poziom dostępu do poszczególnych składowych klasy.Niniejszy modyfikator dostępu stosuje się przy dziedziczeniu i ma on następujące własności :
  2.  
  3. 1) Słowo kluczowe protected nie zezwala na dostęp do stałych, zmiennych, metod itp.spoza klasy(tak jak w przypadku modyfikatora dostępu » standard C++ ♦ private).
  4.  
  5. 2) Składowe klasy oznaczone jako protected są widoczne w obrębie klasy pochodnej.
  6.  
  7. 3) Składowe klasy bazowej oznaczone jako protected mają dostęp chroniony bądź prywatny w klasie pochodnej w zależności od użytego prawa dostępu przy dziedziczeniu.
  8.    Jeśli klasa została odziedziczona z modyfikatorem » standard C++ ♦ public lub protected, poziom dostępu do składowych oznaczonych jako protected zostanie zachowany.**/
  9.  
  10. #include <iostream>
  11.  
  12. using namespace std;
  13.  
  14. class Node
  15. {
  16. private:
  17.     int v; //key, data, dana przechowywana w wezle
  18.     Node* left_node; //wskaznik na lewego syna
  19.     Node* right_node; //wskaznik na prawego syna
  20.     Node* parent_node; //wskaznik na ojca
  21. public:
  22.     Node(int v, Node* l, Node* r) { this->v = v; left_node = l; right_node = r; parent_node = NULL; } //konstruktor, tworzy wezel bez rodzica, czyli korzen
  23.     Node(int v, Node* l, Node* r, Node* p) { this->v = v; left_node = l; right_node = r; parent_node = p; } //konstruktor, tworzy wezel z rodzicem, czyli nie-korzen
  24.     int value(); //zwraca v
  25.     Node* left(); //zwraca left_node
  26.     Node* right(); //zwraca right_node
  27.     Node* parent(); //zwraca parent_node
  28.     void setValue(int v); //ustawia v
  29.     void setLeft(Node* l); //ustawia left_node
  30.     void setRight(Node* r); //ustawia right_node
  31.     void setParent(Node* p); //ustawia parent_node
  32. };
  33.  
  34. int Node::value()
  35. {
  36.     return v;
  37. }
  38.  
  39. Node* Node::left()
  40. {
  41.     return left_node;
  42. }
  43.  
  44. Node* Node::right()
  45. {
  46.     return right_node;
  47. }
  48.  
  49. Node* Node::parent()
  50. {
  51.     return parent_node;
  52. }
  53.  
  54. void Node::setValue(int v)
  55. {
  56.     this->v = v;
  57. }
  58.  
  59. void Node::setLeft(Node* l)
  60. {
  61.     left_node = l;
  62. }
  63.  
  64. void Node::setRight(Node* r)
  65. {
  66.     right_node = r;
  67. }
  68.  
  69. void Node::setParent(Node* p)
  70. {
  71.     parent_node = p;
  72. }
  73.  
  74. class Tree
  75. {
  76. protected: //daje protected zamiast private tak, aby w klasie pochodnej te zmienne i metody byly widoczne
  77.     Node* root; //wskazuje na korzen drzewa
  78.     bool empty(Node* n);    //zwraca true, jesli wezel nie istnieje, false w przeciwnym razie
  79.     void preorder(Node* n); //przejscie preorder
  80.     void inorder(Node* n); //przejscie inorder
  81.     void postorder(Node* n); //przejscie postorder
  82.     int size(Node* n); //oblicza i zwraca liczbe wezlow w drzewie
  83.     int height(Node* n); //oblicza i zwraca wysokosc drzewa, dlugosc najdluzszej sciezki w drzewie
  84.     void clear(Node* n); //usuwa drzewo
  85. public:
  86.     Tree();         //tworzy puste drzewo
  87.     Tree(Node* r);  //tworzy nowe drzewo
  88.     bool empty();       //zwraca true, jesli drzewo jest puste, false w przeciwnym razie
  89.     void preorder(); //wywolujemy protected preorder
  90.     void inorder(); //wywolujemy protected inorder
  91.     void postorder(); //wywolujemy protected postorder
  92.     int size(); //wywolujemy protected size
  93.     int height(); //wywolujemy protected height
  94.     void clear(); //wywolujemy protected clear
  95. };
  96.  
  97. bool Tree::empty(Node* n)
  98. {
  99.     if (n == NULL)
  100.     {
  101.         return true;
  102.     }
  103.     else
  104.     {
  105.         return false;
  106.     }
  107. }
  108.  
  109. void Tree::preorder(Node* n) //rekurencja
  110. {
  111.     if (!empty(n))
  112.     {
  113.         cout << n->value() << " "; //odwiedzamy wezel
  114.         preorder(n->left()); //przechodzimy lewe poddrzewo
  115.         preorder(n->right()); //przechodzimy prawe poddrzewo
  116.     }
  117.     else
  118.     {
  119.         return;
  120.     }
  121. }
  122.  
  123. void Tree::inorder(Node* n) //rekurencja
  124. {
  125.     if (!empty(n))
  126.     {
  127.         inorder(n->left()); //przechodzimy lewe poddrzewo
  128.         cout << n->value() << " "; //odwiedzamy wezel
  129.         inorder(n->right()); //przechodzimy prawe poddrzewo
  130.     }
  131.     else
  132.     {
  133.         return;
  134.     }
  135. }
  136.  
  137. void Tree::postorder(Node* n) //rekurencja
  138. {
  139.     if (!empty(n))
  140.     {
  141.         postorder(n->left()); //przechodzimy lewe poddrzewo
  142.         postorder(n->right()); //przechodzimy prawe poddrzewo
  143.         cout << n->value() << " "; //odwiedzamy wezel
  144.     }
  145.     else
  146.     {
  147.         return;
  148.     }
  149. }
  150.  
  151. int Tree::size(Node* n) //rekurencja
  152. {
  153.    
  154.     /**sprawdzasz lewe poddrzewo, prawe poddrzewo, sumujesz i masz ilość węzłów u dzieci, następnie dodajesz obecny węzeł i masz ilość węzłów poddrzewa i tak od liści do korzenia**/
  155.     int s = 0;
  156.     if (n != NULL)
  157.     {
  158.         s += size(n->left());
  159.         s += size(n->right());
  160.         return ++s;
  161.     }
  162.     else
  163.         return 0;
  164. }
  165.  
  166. int Tree::height(Node* n) //rekurencja
  167. {
  168.     /**Podobnie jest dla wysokości drzewa, tylko tutaj robisz dla każdego węzła jakby dwie możliwości, tj albo idziesz do lewego dziecka, albo do prawego
  169.        Tworzą się wtedy takie pojedyncze drogi od korzenia do liści**/
  170.     int left = 0;
  171.     int right = 0;
  172.     if (!empty(n)) {
  173.         left += height(n->left());
  174.         right += height(n->right());
  175.  
  176.         left++;
  177.         right++;
  178.         if (left > right)
  179.             return left;
  180.         else
  181.             return right;
  182.     }
  183.     else
  184.         return 0;
  185. }
  186.  
  187. void Tree::clear(Node* n) //rekurencja
  188. {
  189.     if (!empty(n->left()))
  190.         clear(n->left());
  191.     if (!empty(n->right()))
  192.         clear(n->right());
  193.  
  194.     delete n;
  195. }
  196.  
  197. Tree::Tree()
  198. {
  199.     root = NULL;
  200. }
  201.  
  202. Tree::Tree(Node* r)
  203. {
  204.     root = r;
  205. }
  206.  
  207. bool Tree::empty()
  208. {
  209.     if (empty(root))
  210.         return true;
  211.     else
  212.         return false;
  213. }
  214.  
  215. void Tree::preorder()
  216. {
  217.     preorder(root);
  218. }
  219.  
  220. void Tree::inorder()
  221. {
  222.     inorder(root);
  223. }
  224.  
  225. void Tree::postorder()
  226. {
  227.     postorder(root);
  228. }
  229.  
  230. int Tree::size()
  231. {
  232.     return size(root);
  233. }
  234.  
  235. int Tree::height()
  236. {
  237.     return height(root);
  238. }
  239.  
  240. void Tree::clear()
  241. {
  242.     clear(root);
  243.     root = NULL;
  244. }
  245.  
  246. class TreeBST :public Tree
  247. {
  248. private:
  249.     Node* minimum(Node* p); //wyznacza wezel o najmniejszej wartosci klucza
  250.     Node* maximum(Node* p); //wyznacza wezel o najwiekszej wartosci klucza
  251. public:
  252.     TreeBST(); //konstruktor, tworzy puste drzewo bst
  253.     TreeBST(Node* r); //konstruktor, tworzy drzewo bst
  254.     void insert(int x); //dodaje wezel do drzewa bst z zachowaniem wlasnosci drzewa bst, dodajemy nowy wezel zawsze jako lisc
  255.     Node* search(int x); //znajduje wezel o kluczy x
  256.     Node* minimum(); //wywolujemy private minimum
  257.     Node* maximum(); //wywolujemy private maximum
  258.     Node* prec(Node* p); //predecessor - poprzednik, znajduje poprzednika wezla p
  259.     Node* succ(Node* p); //successor - nastepnik, znajduje nastepnika wezla p
  260.     void del(Node* p); //usuwa wezel p
  261. };
  262.  
  263. Node* TreeBST::minimum(Node* p)
  264. {
  265.     if (empty(p))
  266.         return NULL;
  267.     Node* currentNode = p;
  268.     while (currentNode->left() != NULL) //wezel o najmniejszym kluczu to ostatni lewy syn
  269.     {
  270.         currentNode = currentNode->left();
  271.     }
  272.     return currentNode;
  273. }
  274.  
  275. Node* TreeBST::maximum(Node* p)
  276. {
  277.     if (empty(p))
  278.         return NULL;
  279.     Node* currentNode = p;
  280.     while (currentNode->right() != NULL) //wezel o najwiekszym kluczu to ostatni prawy syn
  281.     {
  282.         currentNode = currentNode->right();
  283.     }
  284.  
  285.     return currentNode;
  286. }
  287.  
  288. TreeBST::TreeBST()
  289. {
  290.     root = NULL;
  291. }
  292.  
  293. TreeBST::TreeBST(Node* r)
  294. {
  295.     root = r;
  296. }
  297.  
  298. void TreeBST::insert(int x)
  299. {
  300.     if (empty())
  301.     {
  302.         root = new Node(x, NULL, NULL, NULL);
  303.         return;
  304.     }
  305.     bool left = true;
  306.     Node* currentNode = root;
  307.     Node* previousNode = NULL;
  308.     while (currentNode != NULL) //przemieszczamy sie po drzewie do miejsca, w ktorym bedziemy mogli wstawic nowy wezel jako lisc
  309.     {
  310.         if (currentNode->value() >= x)
  311.         {
  312.             previousNode = currentNode;
  313.             currentNode = currentNode->left();
  314.             left = true;
  315.         }
  316.         else
  317.         {
  318.             previousNode = currentNode;
  319.             currentNode = currentNode->right();
  320.             left = false;
  321.         }
  322.     }
  323.  
  324.     currentNode = new Node(x, NULL, NULL, previousNode);
  325.     if (left)
  326.         previousNode->setLeft(currentNode);
  327.     else
  328.         previousNode->setRight(currentNode);
  329. }
  330.  
  331. Node* TreeBST::search(int x)
  332. {
  333.     Node* currentNode = root;
  334.  
  335.     while (currentNode->value() != x)
  336.     {
  337.         if (currentNode->value() >= x)
  338.             currentNode = currentNode->left();
  339.         else
  340.             currentNode = currentNode->right();
  341.  
  342.         if (empty(currentNode))
  343.             return NULL;
  344.     }
  345.     return currentNode;
  346. }
  347.  
  348. Node* TreeBST::minimum()
  349. {
  350.     return minimum(root);
  351. }
  352.  
  353. Node* TreeBST::maximum()
  354. {
  355.     return maximum(root);
  356. }
  357.  
  358. Node* TreeBST::prec(Node* p) //poprzednik wezla p to wezel najwiekszy, ale mniejszy od wezla p
  359. {
  360.     if (empty()) //jesli drzewo jest puste
  361.         return NULL;
  362.  
  363.     if (minimum() == p) //jesli p jest minimum, to nie ma wezla o wartosci mniejszej od p
  364.         return NULL;
  365.  
  366.     if (!empty(p->left())) //jesli wezel p posiada lewego syna, to jego poprzednikiem jest maksimum z jego lewego poddrzewa
  367.         return maximum(p->left());
  368.     else //jesli wezel p nie posiada lewego syna, to jego poprzednikim jest pierwszy rodzic, dla ktorego jest on w prawym poddrzewie
  369.     {
  370.         Node* precNode = p;
  371.         while (precNode->parent()->right() != precNode)
  372.         {
  373.             precNode = precNode->parent();
  374.         }
  375.         return precNode->parent();
  376.     }
  377. }
  378.  
  379. Node* TreeBST::succ(Node* p) //nastepnik wezla p to wezel najmniejszy, ale wiekszy od wezla p
  380. {
  381.     if (empty()) //jesli drzewo jest puste
  382.         return NULL;
  383.  
  384.     if (maximum() == p) //jesli p jest maksimum, to nie ma wezla o wartosci wiekszej od p
  385.         return NULL;
  386.  
  387.     if (!empty(p->right())) //jesli wezel p posiada prawego syna, to jego nastepnikiem jest minimum z jego prawego poddrzewa
  388.         return minimum(p->right());
  389.     else //jesli wezel p nie ma prawego syna, to jego nastepnikiem jest pierwszy rodzic, dla ktorego wezel p jest w lewym podrzewie
  390.     {
  391.         Node* succNode = p;
  392.         while (succNode->parent()->left() != succNode)
  393.         {
  394.             succNode = succNode->parent();
  395.         }
  396.         return succNode->parent();
  397.     }
  398. }
  399.  
  400. void TreeBST::del(Node* p) //usuwa wezel p
  401. {
  402.     if (empty()) //jesli drzewo jest puste
  403.         return;
  404.     if (empty(p)) //jesli wezel p jest pusty
  405.         return;
  406.     if ((empty(p->left())) && (empty(p->right()))) //jesli p jest lisciem, to poprostu usuwam go ze struktury drzewa
  407.     {
  408.         if (p == root)
  409.         {
  410.             root = NULL;
  411.             return;
  412.         }
  413.  
  414.         if (p->parent()->left() == p)
  415.         {
  416.             p->parent()->setLeft(NULL);
  417.         }
  418.         else // lub else if (p->parent()->right() == p)
  419.         {
  420.             p->parent()->setRight(NULL);
  421.         }
  422.        
  423.         delete p;
  424.         return;
  425.     }
  426.     //jesli p ma jednego syna: lewego lub prawego, to zastepujemy go tym synem, odpowiednio lewym lub prawym
  427.     if ((!empty(p->left()))&&(empty(p->right()))) //jesli wezel p ma lewego syna
  428.     {
  429.         if (p == root)
  430.         {
  431.             root = p->left();
  432.             return;
  433.         }
  434.  
  435.         if (p->parent()->left() == p)
  436.         {
  437.             p->parent()->setLeft(p->left());
  438.         }
  439.         else
  440.         {
  441.             p->parent()->setRight(p->left());
  442.         }
  443.  
  444.         p->left()->setParent(p->parent());
  445.         delete p;
  446.         return;
  447.     }
  448.     if ((empty(p->left())) && (!empty(p->right()))) //jesli wezel p ma prawego syna
  449.     {
  450.         if (p == root)
  451.         {
  452.             root = p->right();
  453.             return;
  454.         }
  455.  
  456.         if (p->parent()->left() == p)
  457.         {
  458.             p->parent()->setLeft(p->right());
  459.         }
  460.         else
  461.         {
  462.             p->parent()->setRight(p->right());
  463.         }
  464.         p->right()->setParent(p->parent());
  465.         delete p;
  466.         return;
  467.     }
  468.     if (!empty(p->left()) && !empty(p->right())) //jesli wezel p ma obydwu synow to zastepuje go losowo jego poprzednikiem lub nastepnikiem
  469.     {
  470.         //Node* node1 = prec(p); //wystarczy, ze jedno znajde
  471.         Node* succNode = succ(p);
  472. //      if (p == root)
  473. //      {
  474.             Node* succNodeLeft = succNode->left();
  475.             Node* succNodeRight = succNode->right();
  476.             if (!empty(succNodeLeft))
  477.             {
  478.                 succNodeLeft->setParent(succNode->parent());
  479.                 if (succNode->parent()->left() == succNode)
  480.                 {
  481.                     succNode->parent()->setLeft(succNodeLeft);
  482.                 }
  483.                 else
  484.                 {
  485.                     succNode->parent()->setRight(succNodeLeft);
  486.                 }
  487.             }
  488.             else if(!empty(succNodeRight))
  489.             {
  490.                 succNodeRight->setParent(succNode->parent());
  491.                 if (succNode->parent()->left() == succNode)
  492.                 {
  493.                     succNode->parent()->setLeft(succNodeRight);
  494.                 }
  495.                 else
  496.                 {
  497.                     succNode->parent()->setRight(succNodeRight);
  498.                 }
  499.             }
  500.  
  501.             if (succNode->parent() != p)
  502.             {
  503.                 succNode->setRight(p->right());
  504.             }
  505.             if (p == root)
  506.             {
  507.                 succNode->setParent(NULL);
  508.                 root = succNode;
  509.             }
  510.             else
  511.             {
  512.                 succNode->setParent(p->parent());
  513.                 if (p->parent()->left() == p) {
  514.                     p->parent()->setLeft(succNode);
  515.                 }
  516.                 else {
  517.                     p->parent()->setRight(succNode);
  518.                 }
  519.             }
  520.             succNode->setLeft(p->left());
  521.            
  522.             delete p;
  523.  
  524. //      }
  525.        
  526.     }
  527. }
  528.  
  529. int main()
  530. {
  531.  
  532.     /*
  533.     Tree* t = new Tree(new Node(9, new Node(5, new Node(2, new Node(3, NULL, NULL), new Node(3, NULL, NULL)),
  534.         new Node(7, NULL, new Node(8, NULL, NULL))), new Node(12, new Node(10, NULL, new Node(11, NULL, NULL)), NULL)));
  535.  
  536.     t->preorder();
  537.     cout << endl;
  538.     t->inorder();
  539.     cout << endl;
  540.     t->postorder();
  541.     cout << endl;
  542.  
  543.     t->clear();
  544.     t->preorder();
  545.     cout << endl;
  546.     */
  547.  
  548.     /*
  549.     TreeBST tBST;
  550.     tBST.insert(4);
  551.     tBST.insert(1);
  552.     tBST.insert(5);
  553.     tBST.insert(3);
  554.     tBST.insert(2);
  555.     tBST.preorder();
  556.     */
  557.     TreeBST b;
  558.     b.insert(4);
  559.     b.insert(8);
  560.     b.insert(2);
  561.     b.insert(3);
  562.     b.insert(5);
  563.     b.insert(6);
  564.     b.insert(1);
  565.     b.insert(9);
  566.     b.insert(7);
  567.     b.insert(1);
  568.     b.preorder();
  569.     cout << endl;
  570.     b.del(b.search(2));
  571.     b.preorder();
  572.     cout << endl;
  573.     b.del(b.search(4));
  574.     b.preorder();
  575.     cout << endl;
  576.     b.del(b.search(5));
  577.     b.preorder();
  578.     cout << endl;
  579. //  cout << "Inorder: ";
  580. //  tBST.inorder();
  581. //  cout << endl;
  582. //  Node* node = tBST.search(4);
  583. //  tBST.del(node);
  584. //  tBST.preorder();
  585. //  cout << endl;
  586.     /*
  587.     cout << "Czy znaleziono wezel o kluczu 3: ";
  588.     Node* node;
  589.     node = tBST.search(3);
  590.     if (node != NULL)
  591.     {
  592.         //cout << node->value() << endl;
  593.         cout << "TAK";
  594.     }
  595.     else
  596.     {
  597.         //cout << "Brak wezla" << endl;
  598.         cout << "NIE";
  599.     }
  600.     cout << endl;
  601.  
  602.     cout << "Minimum: ";
  603.     Node* node2;
  604.     node2 = tBST.minimum();
  605.     if(node2 != NULL)
  606.     {
  607.         cout << node2->value() << endl;
  608.     }
  609.     else
  610.     {
  611.          cout << "Brak minimum!" << endl;
  612.     }
  613.     cout << endl;
  614.  
  615.     cout << "Maksimum: ";
  616.     Node* node3;
  617.     node3 = tBST.maximum();
  618.     if(node3 != NULL)
  619.     {
  620.         cout << node3->value() << endl;
  621.     }
  622.     else
  623.     {
  624.          cout << "Brak maksimum!" << endl;
  625.     }
  626.     cout << endl;
  627.    
  628.     cout << "Poprzednik 3: ";
  629.     Node* node4;
  630.     node4 = tBST.prec(node);
  631.     if (node4 != NULL)
  632.     {
  633.         cout << node4->value() << endl;
  634.     }
  635.     else
  636.     {
  637.         cout << "Brak poprzednika!" << endl;
  638.     }
  639.     cout << endl;
  640.  
  641.     cout << "Nastepnik 3: ";
  642.     Node* node5;
  643.     node5 = tBST.succ(node);
  644.     if (node5 != NULL)
  645.     {
  646.         cout << node5->value() << endl;
  647.     }
  648.     else
  649.     {
  650.         cout << "Brak nastepnika!" << endl;
  651.     }
  652.     cout << endl;
  653.  
  654.     cout << "Usuwam wezel o kluczu 2." << endl;
  655.     Node* node6;
  656.     node6 = tBST.search(2);
  657.     tBST.del(node6);
  658.     cout << "Inorder: ";
  659.     tBST.inorder();
  660.     cout << endl;
  661.     */
  662.  
  663.     /**cout << "Usuwam wezel o kluczu 1." << endl;
  664.     Node* node7;
  665.     node7 = tBST.search(1);
  666.     tBST.del(node7);
  667.     cout << "Inorder: ";
  668.     tBST.inorder();
  669.     cout << endl;
  670.  
  671.     cout << "Usuwam wezel o kluczu 5." << endl;
  672.     Node* node8;
  673.     node8 = tBST.search(5);
  674.     tBST.del(node8);
  675.     cout << "Inorder: ";
  676.     tBST.inorder();
  677.     cout << endl;**/
  678.  
  679.     return 0;
  680. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement