Advertisement
xBloodY

AVL Tree

Jul 26th, 2022
935
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.80 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4.     using namespace std;
  5.  
  6. struct subset_node {
  7.     int key;
  8.     subset_node* left;
  9.     subset_node* right;
  10. };
  11.  
  12. bool init(subset_node** sn) { // инициализация пустого дерева (аналогично списку, пустое дерево это указатель на NULL)
  13.     *sn = NULL;
  14.     return true;
  15. }
  16.  
  17. void printgraph(subset_node* sn) {
  18.     if (sn != NULL) {
  19.         if (sn->left != NULL)
  20.             cout << sn->left->key;
  21.         else
  22.             cout << "NULL";
  23.         cout << " <- " << sn->key << " -> ";
  24.         if (sn->right != NULL)
  25.             cout << sn->right->key;
  26.         else
  27.             cout << "NULL";
  28.         cout << endl;
  29.         printgraph(sn->left);
  30.         printgraph(sn->right);
  31.     }
  32. }
  33.  
  34.  
  35. unsigned int size_my(subset_node* sn, unsigned int count) {
  36.     if (sn != NULL) {
  37.         if (sn->left != NULL)
  38.             count += size_my(sn->left, 1);
  39.         if (sn->right != NULL)
  40.             count += size_my(sn->right, 1);
  41.     }
  42.     else
  43.         return 0;
  44.     return count;
  45. }
  46.  
  47. unsigned int size(subset_node* sn) { // количество элементов в дереве
  48.     return size_my(sn, 1);
  49. }
  50.  
  51. bool bfs_my(subset_node* sn, vector<subset_node*> data, int* res, int* l) {
  52.     if (data.size() != 0) {
  53.         if (data[0]->right != NULL)
  54.             data.push_back(data[0]->right);
  55.         if (data[0]->left != NULL)
  56.             data.push_back(data[0]->left);
  57.         *(res + (*l)) = data[0]->key;
  58.         (*l)++;
  59.         data.erase(data.begin());
  60.         bfs_my(sn, data, res, l);
  61.     }
  62.     else {
  63.         if (sn == NULL)
  64.             return false;
  65.         else if ((*l) == 0) {
  66.             if (sn->right != NULL)
  67.                 data.push_back(sn->right);
  68.             if (sn->left != NULL)
  69.                 data.push_back(sn->left);
  70.             *(res + (*l)) = sn->key;
  71.             (*l)++;
  72.             bfs_my(sn, data, res, l);
  73.         }
  74.     }
  75.     return true;
  76. }
  77.  
  78. int* BFS(subset_node* sn) { //обход в ширину, возвращает указатель на массив
  79.     vector<subset_node*> data;
  80.     unsigned int n = size(sn);
  81.     int* res = new int[n];
  82.     int l = 0;
  83.     bfs_my(sn, data, res, &l);
  84.     return res;
  85. }
  86.  
  87. bool dfs_my(subset_node* sn, int* res, int* l) {
  88.     if (sn != NULL) {
  89.         if (sn->left != NULL)
  90.             dfs_my(sn->left, res, l);
  91.         *(res + *l) = sn->key;
  92.         (*l)++;
  93.         if (sn->right != NULL)
  94.             dfs_my(sn->right, res, l);
  95.         return true;
  96.     }
  97.     else
  98.         return false;
  99. }
  100.  
  101. int* DFS(subset_node* sn) { //обход в глубину, возвращает указатель на массив
  102.     unsigned int n = size(sn);
  103.     int* res = new int[n];
  104.     int l = 0;
  105.     dfs_my(sn, res, &l);
  106.     return res;
  107. }
  108.  
  109. bool height_my(subset_node* sn, unsigned int count, unsigned int* max_count) {
  110.     if (sn != NULL) {
  111.         ++count;
  112.         if (count > * max_count)
  113.             *max_count = count;
  114.         height_my(sn->left, count, max_count);
  115.         height_my(sn->right, count, max_count);
  116.     }
  117.     return true;
  118. }
  119.  
  120. unsigned int height(subset_node* sn) { // высота дерева
  121.     unsigned int res = 0;
  122.     height_my(sn, 0, &res);
  123.     return res;
  124. }
  125.  
  126. int bfactor(subset_node* sn) { // проверка на сбалансированность
  127.     return height(sn->right) - height(sn->left);
  128. }
  129.  
  130.  
  131. subset_node* rotateleft(subset_node* sn) {
  132.     subset_node* r = sn->right;
  133.     sn->right = r->left;
  134.     r->left = sn;
  135.     return r;
  136. }
  137.  
  138. subset_node* rotateright(subset_node* sn) {
  139.     subset_node* l = sn->left;
  140.     sn->left = l->right;
  141.     l->right = sn;
  142.     return l;
  143. }
  144.  
  145. subset_node* balance(subset_node* sn) // балансировка узла p
  146. {
  147.     if (bfactor(sn) == 2) {
  148.         if (bfactor(sn->right) < 0)
  149.             sn->right = rotateright(sn->right);
  150.         return rotateleft(sn);
  151.     }
  152.     if (bfactor(sn) == -2) {
  153.         if (bfactor(sn->left) > 0)
  154.             sn->left = rotateleft(sn->left);
  155.         return rotateright(sn);
  156.     }
  157.     return sn; // балансировка не нужна
  158. }
  159.  
  160. subset_node* balance_all(subset_node* sn) {
  161.     if (sn != NULL) {
  162.         subset_node* tmp = balance(sn);
  163.         subset_node* l = tmp->left;
  164.         subset_node* r = tmp->right;
  165.         tmp->left = balance_all(l);
  166.         tmp->right = balance_all(r);
  167.         return tmp;
  168.     }
  169.     return NULL;
  170. }
  171.  
  172. bool insert_my(subset_node** sn, subset_node* new_elem) { // добавление элемента в дерево,
  173.     if (*sn == NULL) {
  174.         *sn = new_elem;
  175.     }
  176.     else if (new_elem == NULL)
  177.         return true;
  178.     else {
  179.         subset_node* iter_first = *sn;
  180.         subset_node* iter_second = NULL;
  181.         while (iter_first != NULL) {
  182.             iter_second = iter_first;
  183.             if (new_elem->key < iter_first->key) {
  184.                 iter_first = iter_first->left;
  185.             }
  186.             else if (new_elem->key > iter_first->key)
  187.                 iter_first = iter_first->right;
  188.             else {
  189.                 delete new_elem; //элемент не добавляем, удаляем его
  190.                 return false;
  191.             }
  192.         }
  193.         if (new_elem->key < iter_second->key)
  194.             iter_second->left = new_elem;
  195.         else
  196.             iter_second->right = new_elem;
  197.     }
  198.     *sn = balance_all(*sn);
  199.     return true;
  200. }
  201.  
  202. bool insert(subset_node** sn, int k) { // добавление элемента в дерево,
  203. // дубли игнорировать (ничего не добавлять в дерево, если там уже есть элемент с таким же key) и возвращать false
  204.     subset_node* tmp = new subset_node;
  205.     tmp->key = k;
  206.     tmp->left = NULL;
  207.     tmp->right = NULL;
  208.     return insert_my(sn, tmp);
  209. }
  210.  
  211. subset_node* find(subset_node* sn, int k) { // поиск элемента в дереве, нужно вернуть
  212. // указатель на элемент с тем же key или, если такого элемента не нашлось, то NULL
  213.     subset_node* iter_first = sn;
  214.     while (iter_first != NULL) {
  215.         if (k < iter_first->key)
  216.             iter_first = iter_first->left;
  217.         else if (k > iter_first->key)
  218.             iter_first = iter_first->right;
  219.         else
  220.             return iter_first;
  221.     }
  222.     return NULL;
  223. }
  224.  
  225. void find_elem_and_pred(subset_node* sn, subset_node** elem, subset_node** pred_elem,
  226.     int k) { // поиск элемента в дереве, нужно вернуть
  227. // указатель на элемент с тем же key или, если такого элемента не нашлось, то NULL
  228.     subset_node* iter_first = sn;
  229.     subset_node* iter_second = NULL;
  230.     while (iter_first != NULL) {
  231.         if (k < iter_first->key) {
  232.             iter_second = iter_first;
  233.             iter_first = iter_first->left;
  234.         }
  235.         else if (k > iter_first->key) {
  236.             iter_second = iter_first;
  237.             iter_first = iter_first->right;
  238.         }
  239.         else {
  240.             *elem = iter_first;
  241.             *pred_elem = iter_second;
  242.             break;
  243.         }
  244.     }
  245. }
  246.  
  247. bool remove_old(subset_node** sn, int k) { // удаление элемента из дерева (если элемента не нашлось,
  248. // то ничего не удалять и вернуть false)
  249.     if (*sn == NULL)
  250.         return false;
  251.     else {
  252.         subset_node* elem = NULL, * pred_elem = NULL;
  253.         find_elem_and_pred(*sn, &elem, &pred_elem, k);
  254.         if (elem != NULL) {
  255.             if (pred_elem != NULL) {
  256.                 if (elem == pred_elem->left) {
  257.                     pred_elem->left = NULL;
  258.                 }
  259.                 else {
  260.                     pred_elem->right = NULL;
  261.                 }
  262.                 insert_my(sn, elem->left);
  263.                 insert_my(sn, elem->right);
  264.             }
  265.             else { // удаляем корень
  266.                 *sn = NULL;
  267.                 insert_my(sn, elem->left);
  268.                 insert_my(sn, elem->right);
  269.             }
  270.             delete elem;
  271.             return true;
  272.         }
  273.         return false;
  274.     }
  275. }
  276.  
  277. bool remove(subset_node** sn, int k) { // удаление элемента из дерева (если элемента не нашлось,
  278. // то ничего не удалять и вернуть false)
  279.     if (*sn == NULL)
  280.         return false;
  281.     else {
  282.         subset_node* elem = NULL, * pred_elem = NULL;
  283.         find_elem_and_pred(*sn, &elem, &pred_elem, k);
  284.         if (elem != NULL) {
  285.             subset_node* iter_first = elem->left;
  286.             if (iter_first == NULL) {
  287.                 if (pred_elem->left == elem)
  288.                     pred_elem->left = elem->right;
  289.                 else
  290.                     pred_elem->right = elem->right;
  291.             }
  292.             else {
  293.                 subset_node* iter_second = NULL;
  294.                 while (iter_first != NULL) {
  295.                     iter_second = iter_first;
  296.                     iter_first = iter_first->right;
  297.                 }
  298.                 subset_node* elem1 = NULL, * pred_elem1 = NULL;
  299.                 find_elem_and_pred(*sn, &elem1, &pred_elem1, iter_second->key);
  300.                 elem->key = iter_second->key;
  301.                 if (pred_elem1->left == elem1)
  302.                     pred_elem1->left = elem1->left;
  303.                 else
  304.                     pred_elem1->right = elem1->left;
  305.             }
  306.         }
  307.         *sn = balance_all(*sn);
  308.         return true;
  309.     }
  310. }
  311.  
  312. void destructor(subset_node* sn) { // очистить всю используемую память
  313.     subset_node* iter_first = sn;
  314.     if (sn != NULL) {
  315.         destructor(sn->left);
  316.         destructor(sn->right);
  317.         delete sn;
  318.     }
  319. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement