Advertisement
Hanaigi

Untitled

Oct 7th, 2024
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.07 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <ctime>
  3. #include <iomanip>
  4. #include <iostream>
  5. #include <cmath>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9.  
  10. struct vertex {
  11.     int data;
  12.     vertex *left;
  13.     vertex *right;
  14.     int Bal;
  15. };
  16.  
  17. void ObhodLR(vertex *p) {
  18.     if (p != NULL) {
  19.         ObhodLR(p->left);
  20.         cout << p->data << "  ";
  21.         ObhodLR(p->right);
  22.     }
  23. }
  24.  
  25. int Size(vertex *p) {
  26.     if (p == NULL) return 0;
  27.     return 1 + Size(p->left) + Size(p->right);
  28. }
  29.  
  30. int Sum(vertex *p) {
  31.     if (p == NULL) return 0;
  32.     return p->data + Sum(p->left) + Sum(p->right);
  33. }
  34.  
  35. int Height(vertex *p) {
  36.     if (p == NULL) return 0;
  37.     return 1 + max(Height(p->left), Height(p->right));
  38. }
  39.  
  40. float SumPaths(vertex *p, int L) {
  41.     if (p == NULL) return 0;
  42.     return L + SumPaths(p->left, L + 1) + SumPaths(p->right, L + 1);
  43. }
  44.  
  45. float Averageheight(vertex *p){
  46.     if(p == NULL) return 0;
  47.     else return (float(SumPaths(p, 1)) / Size(p));
  48. }
  49.  
  50. vertex* LL(vertex* &p) {
  51.     vertex* q = p->left;
  52.     p->Bal = 0;
  53.     q->Bal = 0;
  54.     p->left = q->right;
  55.     q->right = p;
  56.    
  57.     return q;
  58. }
  59.  
  60. vertex* RR(vertex* &p) {
  61.     vertex* q = p->right;
  62.     p->Bal = 0;
  63.     q->Bal = 0;
  64.     p->right = q->left;
  65.     q->left = p;
  66.  
  67.     return q;
  68. }
  69.  
  70. vertex* LR(vertex* &p) {
  71.     vertex* q = p->left;
  72.     vertex* r = q->right;
  73.    
  74.     if (r->Bal < 0)
  75.         p->Bal = 1;
  76.     else
  77.         p->Bal = 0;
  78.  
  79.     if (r->Bal > 0)
  80.         q->Bal = -1;
  81.     else
  82.         q->Bal = 0;
  83.  
  84.     r->Bal = 0;
  85.  
  86.     q->right = r->left;
  87.     p->left = r->right;
  88.     r->left = q;
  89.     r->right = p;
  90.  
  91.     return r;
  92. }
  93.  
  94. vertex* RL(vertex* &p) {
  95.     vertex* q = p->right;
  96.     vertex* r = q->left;
  97.    
  98.     if (r->Bal > 0)
  99.         p->Bal = -1;
  100.     else
  101.         p->Bal = 0;
  102.  
  103.     if (r->Bal < 0)
  104.         q->Bal = 1;
  105.     else
  106.         q->Bal = 0;
  107.  
  108.     r->Bal = 0;
  109.  
  110.     q->left = r->right;
  111.     p->right = r->left;
  112.     r->right = q;
  113.     r->left = p;
  114.  
  115.     return r;
  116. }
  117.  
  118. bool AVL(int D, vertex*& p, bool& Rost) {
  119.     if (p == NULL) {
  120.         p = new vertex;
  121.         p->data = D;
  122.         p->left = NULL;
  123.         p->right = NULL;
  124.         p->Bal = 0;
  125.         Rost = true;
  126.         return true;
  127.     }
  128.  
  129.     if (D < p->data) {
  130.         if (AVL(D, p->left, Rost)) {
  131.             if (Rost) {
  132.                 if (p->Bal > 0) {
  133.                     p->Bal = 0;
  134.                     Rost = false;
  135.                 } else if (p->Bal == 0) {
  136.                     p->Bal = -1;
  137.                     Rost = true;
  138.                 } else {
  139.                     if (p->left->Bal < 0) {
  140.                         p = LL(p);
  141.                     } else {
  142.                         p = LR(p);
  143.                     }
  144.                     Rost = false;
  145.                 }
  146.             }
  147.         }
  148.     } else if (D > p->data) {
  149.         if (AVL(D, p->right, Rost)) {
  150.             if (Rost) {
  151.                 if (p->Bal < 0) {
  152.                     p->Bal = 0;
  153.                     Rost = false;
  154.                 } else if (p->Bal == 0) {
  155.                     p->Bal = 1;
  156.                     Rost = true;
  157.                 } else {
  158.                     if (p->right->Bal > 0) {
  159.                         p = RR(p);
  160.                     } else {
  161.                         p = RL(p);
  162.                     }
  163.                     Rost = false;
  164.                 }
  165.             }
  166.         }
  167.     } else {
  168.         Rost = false;
  169.     }
  170.  
  171.     return true;
  172. }
  173.  
  174. vertex* ISDP(int* elements, int L, int R) {
  175.     if (L > R) return NULL;
  176.  
  177.     int m = ceil((L + R) / 2.0);
  178.     vertex* p = new vertex;
  179.     p->data = elements[m];
  180.     p->left = ISDP(elements, L, m - 1);
  181.     p->right = ISDP(elements, m + 1, R);
  182.     p->Bal = 0;
  183.     return p;
  184. }
  185.  
  186. void ShuffleArray(int* arr, int size) {
  187.     for (int i = size - 1; i > 0; --i) {
  188.         int j = rand() % (i + 1);
  189.         swap(arr[i], arr[j]);
  190.     }
  191. }
  192.  
  193. int main() {
  194.     srand(time(0));
  195.  
  196.     int N = 100;
  197.  
  198.     int* elements = new int[N];
  199.  
  200.     for (int i = 0; i < N; ++i) {
  201.         elements[i] = i+1;
  202.     }
  203.  
  204.     vertex* rootISDP = ISDP(elements, 0, N-1);
  205.  
  206.     ShuffleArray(elements, N);
  207.  
  208.     vertex* rootAVL = NULL;
  209.     bool Rost = false;
  210.     for (int i = 0; i < N; ++i) {
  211.         AVL(elements[i], rootAVL, Rost);
  212.     }
  213.  
  214.     cout << "Обход LR по АВЛ-дереву для проверки" << endl;
  215.     ObhodLR(rootAVL);
  216.     cout << endl << endl;
  217.    
  218.     printf("\n|-----------------|-------------|----------------|--------------|--------------|\n");
  219.     cout << "|       " << "   |" << "Size  " << "   |" << "Checksum" << "    |" << "Height " << "   |" << "Average_height|" << endl;
  220.     cout << "|ISDP   " << "   |" << Size(rootISDP) << "     |" << Sum(rootISDP) << "         |" << Height(rootISDP) << "        |"; printf("%.2f", Averageheight(rootISDP)); cout << "          |" << endl;
  221.     cout << "|AVL    " << "   |" << Size(rootAVL) << "      |" << Sum(rootAVL) << "      |" << Height(rootAVL) << "     |"; printf("%.2f", Averageheight(rootAVL)); cout << "          |" << endl;
  222.     printf("|-----------------|-------------|----------------|--------------|--------------|");
  223.     delete[] elements;
  224.     return 0;
  225. }
  226.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement