Advertisement
matogens

KamilCompleteBinaryTree

Nov 13th, 2019
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.76 KB | None | 0 0
  1. #ifndef DRZEWO
  2. #define DRZEWO
  3.  
  4. #include<iostream>
  5. #include<string>
  6. #include<cstdlib>
  7. #include<sstream>
  8. #include<fstream>
  9.  
  10. class element;
  11.  
  12. class tree {
  13. private:
  14.     element* root;
  15.     unsigned int size;
  16. public:
  17.     tree() : root(nullptr), size(0) {};
  18.    
  19.     int push(int val);
  20.     int get_size() { return size; }
  21.     void set_size(int VAL) { size = VAL; }
  22.     void go_through();
  23. };
  24.  
  25. class element {
  26. private:
  27.     int local_size;
  28.     int val;
  29.     element* parent;
  30.     element* left;
  31.     element* right;
  32.  
  33. public:
  34.     element* get_left() { return left; }
  35.     element* get_right() { return right; }
  36.     element* get_parent() { return parent; }
  37.     int get_val() { return val; }
  38.     int get_local_size() { return local_size; }
  39.  
  40.     void set_val(int VAL) { val = VAL; }
  41.     void set_left(element* tmp) { left = tmp; }
  42.     void set_right(element* tmp) { right = tmp; }
  43.     void set_parent(element* tmp) { parent = tmp; }
  44.     void show_val() { std::cout << val; }
  45.     void set_local_size(int VAL) { local_size = VAL; }
  46.  
  47.     element() : val(-1), left(nullptr), right(nullptr), parent(nullptr), local_size(1){};
  48.     element(int VAL, element* LEFT, element* RIGHT,element* PARENT) : val(val), right(RIGHT), left(LEFT), parent(PARENT) {};
  49. };
  50.  
  51. int pusher(int val, unsigned int size, element* root) {
  52.     element* tmp = new element;
  53.     element* par = root;
  54.     tmp->set_val(val);
  55.     /*if (get_size() == 0) {
  56.         root = tmp;                 dodanie pierwszego w funkcji klasy;
  57.     }*/
  58.  
  59.     //jesli lewy pusty
  60.     if (root->get_left() == nullptr) {
  61.         root->set_left(tmp);
  62.         root->get_left()->set_parent(root);
  63.         //zwiekszenie wartosci wielkosci drzewa pod elementem ze samym soba
  64.         //root->set_local_size(root->get_local_size() + 1);
  65.         //return 0;
  66.     }
  67.     else
  68.     //jesli prawy pusty
  69.     if (root->get_right() == nullptr) {
  70.         root->set_right(tmp);
  71.         root->get_right()->set_parent(root);
  72.         //zwiekszenie wartosci wielkosci drzewa pod elementem ze samym soba
  73. //      root->set_local_size(root->get_local_size() + 1);
  74.     //  return 0;
  75.     }
  76.     else {
  77.         //idziemy w lewo
  78.         if (root->get_local_size() % 2 == 1) {
  79.             par = par->get_left();
  80.             pusher(val, root->get_local_size(), par);
  81.             //zwiekszenie wartosci wielkosci drzewa pod elementemze samym soba
  82.     //      root->set_local_size(root->get_local_size() + 1);
  83. //          return 0;
  84.         }
  85.         //idziemy w prawo
  86.         if (root->get_local_size() % 2 == 0) {
  87.             par = par->get_right();
  88.             pusher(val, root->get_local_size(), par);
  89.             //zwiekszenie wartosci wielkosci drzewa pod elementem ze samym soba
  90.         //  root->set_local_size(root->get_local_size() + 1);
  91. //          return 0;
  92.         }
  93.     }
  94.     root->set_local_size(root->get_local_size() + 1);
  95.  
  96.     return -1;
  97. }
  98.  
  99.  
  100. int tree::push(int val) {
  101.     element* tmp = new element;
  102.     if (get_size() == 0) {
  103.         root = tmp;
  104.         root->set_val(val);
  105.         set_size(get_size() + 1);
  106.         return 0;
  107.     }
  108.     pusher(val, get_size(), root);
  109.     set_size(get_size() + 1);
  110.     return 0;
  111. }
  112.  
  113.  
  114. tree* read_to_class(std::string nazwa_pliku, int ilosc) {
  115.     tree* ret_list = new tree;
  116.     element* tmp = new element;
  117.  
  118.     std::string str;
  119.     int intek;
  120.  
  121.     std::ifstream plik;
  122.     plik.open(nazwa_pliku, std::ios::in);
  123.     if (plik.good()) {
  124.         while (!plik.eof()) {
  125.             //for(int i = 0; i<ilosc;++i ){
  126.  
  127.             std::getline(plik, str, ' ');
  128.             intek = atoi(str.c_str());
  129.             tmp->set_val(intek);
  130.             ret_list->push(intek);
  131.         }
  132.     }
  133.     return ret_list;
  134. }
  135.  
  136. /*void tree::go_through() {
  137.     element tmp = *root;
  138.     this->root->show_val();
  139.     while (tmp == root) {
  140.         while (tmp.get_left() != nullptr) {
  141.             tmp.show_val();
  142.             tmp = tmp.get_left();
  143.         }
  144.         tmp = tmp.get_parent();
  145.  
  146.     }
  147. }*/
  148.  
  149.  
  150.  
  151. void show_all(element* root) {
  152.     element* left = root->get_left();
  153.     element* right = root->get_right();
  154.     if (left != nullptr) {
  155.         std::cout << left->get_val() << " "; //<< std::endl;
  156.     }
  157.     if (right != nullptr) {
  158.         std::cout << right->get_val() << " "; //<< std::endl;
  159.     }
  160.     if (left->get_left() != nullptr || left->get_right() != nullptr) {
  161.         show_all(left);
  162.     }
  163.     if (right->get_left() != nullptr || right->get_right() != nullptr) {
  164.         show_all(right);
  165.     }
  166. }
  167.  
  168. void preorder(element* root) {
  169.    
  170.     element* left = root->get_left();
  171.     element* right = root->get_right();
  172.     std::cout << root->get_val() << " ";
  173.  
  174.     if (left != nullptr) {
  175.         std::cout << left->get_val() << " "; //<< std::endl;
  176.         if (left->get_left() != nullptr) {
  177.            
  178.             preorder(left->get_left());
  179.         }
  180.         if(left->get_right() != nullptr){
  181.             //std::cout << std::endl;
  182.             preorder(left->get_right());
  183.         }
  184.     }
  185.  
  186.     if (right != nullptr) {
  187.         std::cout << right->get_val() << " "; //<< std::endl;
  188.         if (right->get_left() != nullptr) {
  189.             preorder(right->get_left());
  190.         }
  191.         if (right->get_right() != nullptr) {
  192.             //std::cout << std::endl;
  193.             preorder(right->get_right());
  194.         }
  195.     }
  196.  
  197.  
  198.  
  199. }
  200.  
  201. void tree::go_through() {
  202.     // std::cout << this->root->get_val() << " ";
  203.     //show_all(this->root);
  204.     preorder(this->root);
  205. }
  206.  
  207. #endif // !DRZEWO
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement