Advertisement
Phoenix_x

Untitled

Apr 20th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.75 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. struct elem { //структура на дървото
  7.     int key;  //стойност на елемента
  8.     elem* left; // ляво поддърво
  9.     elem* right; //дясно поддърво
  10. } *root = NULL; // инициализация на корена
  11.  
  12.  
  13. void obhozdane(elem *t);
  14. void add(int n, elem *&t);
  15. void brojVarhoveLqvo(elem *t);
  16. void brojVarhoveDqsno(elem *t);
  17.  
  18. int brojVarhove_lqvo = -1;
  19. int brojVarhove_dqsno = -1;
  20. bool balansirano = true;
  21.  
  22.  
  23. void main()
  24. {
  25.     int broj;
  26.     cout << "Broj elementi: ";
  27.     cin >> broj;
  28.  
  29.     while (broj < 1) { //ако потребителя въведе число по-малко от 1 за брой, накарай го да въвежда пак число
  30.         cout << "Nevaliden broj" << endl;
  31.         cout << "Broj elementi: ";
  32.         cin >> broj;
  33.     }
  34.  
  35.     int number; //елемент на дървото
  36.     cout << "Vavedete elementi: " << endl;
  37.  
  38.     for (int i = 0; i < broj; i++)
  39.     {
  40.         cin >> number;
  41.         add(number, root);
  42.     }
  43.  
  44.     obhozdane(root);
  45.  
  46.     if (balansirano)
  47.         cout << "idealno balansirano" << endl;
  48.     else
  49.         cout << "ne e idealno balansirano" << endl;
  50.  
  51.     system("pause"); //да, има такова
  52. }
  53.  
  54.  
  55. //obhozdane prav red - корен, lqvo poddarvo dqsno poddarvo
  56. void obhozdane(elem *t) //t -  цялото дърво или поддърво
  57. {
  58.     if (t)
  59.     {
  60.         obhozdane(t->left);
  61.         obhozdane(t->right);
  62.  
  63.         bool hasLeaves = (t->left != NULL || t->right != NULL);
  64.  
  65.         if (hasLeaves) {
  66.             brojVarhoveLqvo(t);
  67.             brojVarhoveDqsno(t);
  68.  
  69.             if (abs(brojVarhove_lqvo - brojVarhove_dqsno) > 1) { //|5 - 3| = |3 - 5| = 2
  70.                 balansirano = false;
  71.                 return; //недей обхожда повече
  72.             }
  73.  
  74.             brojVarhove_lqvo = -1;
  75.             brojVarhove_dqsno = -1;
  76.         }
  77.     }
  78. }
  79.  
  80. void add(int n, elem *&t)
  81. {
  82.     if (t == NULL) //в случай, че дървото няма елементи, или е след листо
  83.     {
  84.         t = new elem;
  85.         t->key = n;
  86.         t->left = t->right = NULL;
  87.     }
  88.     else
  89.     {
  90.         if (t->key < n) //ако е по-голямо от върха, сложи го от дясно
  91.         {
  92.             add(n, t->right);
  93.         }
  94.         else //ако е по-малко от върха, сложи го от дясно
  95.         {
  96.             add(n, t->left);
  97.         }
  98.     }
  99. }
  100.  
  101. void brojVarhoveLqvo(elem *t) //t -  цялото дърво или поддърво
  102. {
  103.     if (t)
  104.     {
  105.         brojVarhoveLqvo(t->left);
  106.  
  107.         bool hasLeaves = (t->left != NULL || t->right != NULL);
  108.  
  109.         if (hasLeaves) {
  110.             brojVarhove_lqvo++;
  111.         }
  112.     }
  113. }
  114.  
  115. void brojVarhoveDqsno(elem *t) //t -  цялото дърво или поддърво
  116. {
  117.     if (t)
  118.     {
  119.         brojVarhoveDqsno(t->right);
  120.  
  121.         bool hasLeaves = (t->left != NULL || t->right != NULL);
  122.  
  123.         if (hasLeaves) {
  124.             brojVarhove_dqsno++;
  125.         }
  126.     }
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement