hpnq

dasha

Jun 27th, 2024 (edited)
773
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.85 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <iomanip>
  4. #include <string.h>
  5. #include <windows.h>
  6. using namespace std;
  7.  
  8. struct Countries {
  9.     string name; //название страны
  10.     string capital; //столица
  11.     double population; //численность населения
  12.     double populationPercent; //процент населения от общемирового
  13.     double area; //площадь
  14. };
  15.  
  16. struct node // описание узла дерева
  17. {
  18.     Countries countries;// поле данных - переменная типа страна
  19.     node* left, * right; // указатели на левое и правое поддеревья
  20. };
  21.  
  22.  
  23.  
  24. void inputstudent(Countries& countries)//ввод данных о студенте
  25. {
  26.     cout << "Введите название страны: " << endl;
  27.     cin >> countries.name;
  28.     cout << "Введите столицу:" << endl;
  29.     cin >> countries.capital;
  30.     cout << "Введите численность населения:" << endl;
  31.     cin >> countries.population;
  32.     cout << "Введите процент населения от общемирового:" << endl;
  33.     cin >> countries.populationPercent;
  34.     cout << "Введите площадь:" << endl;
  35.     cin >> countries.area;
  36.  
  37. }
  38.  
  39.  
  40. //ввод массива с клавиатуры
  41. void inputMasFromKeyboard(Countries*& mas, unsigned int& size)
  42. {
  43.     cout << "Введите размер массива" << endl;
  44.     cin >> size;
  45.     if (size == 0) return;//если размер=0, то выходим из функции
  46.     mas = new Countries[size];//создаем динамический массив
  47.     int i;//индекс элемента массива
  48.     for (i = 0; i < size; i++)
  49.     {
  50.         cout << "Введите информацию о стране:" << endl;
  51.         inputstudent(mas[i]);
  52.     }
  53. }
  54.  
  55. void printStudent(Countries countries)//печать данных о студенте
  56. {
  57.     cout << left << setw(10) << countries.name << setw(15) << countries.capital << setw(10) << countries.population << setw(9)
  58.          << countries.populationPercent << setw(5) << countries.area  << endl;;
  59.  
  60. }
  61.  
  62. void printMas(Countries* mas, unsigned int size)
  63. {
  64.     if (!size) return;
  65.     cout << "Созданный массив с информацией о странах:" << endl;
  66.     cout << left << setw(10) << "Название" << setw(15) << "Столица" << setw(10) << "Числ.населения" << setw(9)
  67.          << "Процент населения" << setw(5) << "Площадь" << endl;
  68.     for (int i = 0; i < size; i++)
  69.     {
  70.         printStudent(mas[i]);
  71.     }
  72. }
  73.  
  74.  
  75. void insert(node** p, Countries countries) // добавление узла в дерево поиска
  76. {
  77.     if (*p == NULL)//или (!*p) //нашли пустой указатель – пустое место
  78.     { //создаём новый узел дерева на найденном месте
  79.         *p = new node;
  80.         (*p)->countries = countries;
  81.         (*p)->left = NULL;
  82.         (*p)->right = NULL;
  83.     }
  84.     else
  85.     { //если текущий узел не пуст
  86.         if (countries.name < (*p)->countries.name) insert(&(*p)->left, countries); //идём в левое поддерево
  87.         if (countries.name > (*p)->countries.name) insert(&(*p)->right, countries); //идём в правое поддерево
  88.         //одинаковые значения не добавляем!
  89.     }
  90. }
  91.  
  92. // распечатка дерева в симметричном порядке
  93. void printsim(const node* p)
  94. {
  95.     if (p != NULL) // если дерево не пусто
  96.     {
  97.         printsim(p->left); // печатаем левое поддерево
  98.         printStudent(p->countries); // печатаем значение поля - всю структуру типа tstudent
  99.         printsim(p->right); // печатаем правое поддерево
  100.     }
  101. }
  102.  
  103.  
  104. void clear(node** p) // очистка дерева
  105. {
  106.     if ((*p) != NULL) // если дерево не пусто
  107.     {
  108.         clear(&(*p)->left); // удаляем левое поддерево
  109.         clear(&(*p)->right); // удаляем правое поддерево
  110.         delete* p; //Удаляем указатель на текущий узел
  111.         *p = NULL;//Присваиваем ему пустой указатель
  112.     }
  113. }
  114.  
  115.  
  116. //функция создания деревьев из массива
  117. void createTrees(Countries* mas, unsigned int size, node** root1, node** root2)
  118. {
  119.     if (!size) return;
  120.     for (int i = 0; i < size; i++)
  121.     {
  122.         if (mas[i].population > 100) insert(root1, mas[i]); // Добавляем новый узел в первое дерево поиска
  123.         else insert(root2, mas[i]); // Добавляем новый узел в первое дерево поиска
  124.     }
  125. }
  126.  
  127.  
  128. //нахождение количества узлов
  129. int count(const node* p)
  130. {
  131.     if (p == NULL) return 0;
  132.     return 1 + count(p->left) + count(p->right);
  133. }
  134.  
  135.  
  136.  
  137. // высота дерева
  138. int height(const node* p)
  139. {
  140.     if (p == NULL) return 0;
  141.     //иначе
  142.     int h1 = height(p->left);//считаем высоту левого поддерева
  143.     int h2 = height(p->right);//считаем высоту правого поддерева
  144.     if (h1 >= h2) return h1 + 1;//возвращаем высоту большего из них+1 - так как добавляем наш узел
  145.     return h2 + 1;
  146. }
  147.  
  148.  
  149.  
  150. //печать значений узлов из самой длинной ветки
  151. void printLong(const node* p)
  152. {
  153.     if (p != NULL)
  154.     {
  155.         printStudent(p->countries);
  156.         int h1 = height(p->left);
  157.         int h2 = height(p->right);
  158.         if (h1 >= h2) printLong(p->left);
  159.         else printLong(p->right);
  160.     }
  161. }
  162.  
  163.  
  164.  
  165. double sayminarea(const node *p ){
  166.     if (p != NULL) // если дерево не пусто
  167.     {
  168.  
  169.         double s1 = sayminarea(p->left); // печатаем левое поддерево
  170.         double s2 = sayminarea(p->right); // печатаем правое поддерево
  171.         return min(p->countries.area, min(s1, s2)); // минимальная площадь поддеревьев.
  172.     }
  173.  
  174.     return 100000000; //
  175. }
  176. int saymaxlevel(const node *p, string s){
  177.     //height
  178.  
  179.     if (p != NULL) // если дерево не пусто
  180.     {
  181.  
  182.         int s1 = saymaxlevel(p->left, s); // печатаем левое поддерево
  183.         int s2 = saymaxlevel(p->right, s); // печатаем правое поддерево
  184.         if(p->countries.name[0] == s[0]){
  185.             return max(height(p), max(s1, s2)); // минимальная площадь поддеревьев
  186.         }
  187.         return max(s1, s2);
  188.     }
  189.     return 0 ;
  190.  
  191. }
  192. int main() {
  193.     SetConsoleCP(1251);
  194.     SetConsoleOutputCP(1251);
  195.     Countries* mas = NULL;//указатель на динамический массив типа Студент
  196.     unsigned int size = 0;
  197.     inputMasFromKeyboard(mas, size);
  198.     if (size) {
  199.  
  200.         node* root1 = NULL, * root2 = NULL; // Указатели на корень первого и второго деревьев
  201.         printMas(mas, size);
  202.         cout << endl;
  203.  
  204.         createTrees(mas, size, &root1, &root2);
  205.  
  206.         cout << "Распечатка первого дерева в симметричном порядке" << endl;
  207.         printsim(root1); // распечатка первого дерева в симметричном порядке
  208.         cout << endl;
  209.         cout << "Распечатка второго дерева в симметричном порядке" << endl;
  210.         printsim(root2); // распечатка второго дерева в симметричном порядке
  211.         cout << endl;
  212.         cout << "Количество узлов первого дерева " << count(root1) << endl;
  213.         cout << endl;
  214.         cout << "Узлы длинной ветки:" << endl;
  215.         printLong(root2);
  216.  
  217.         // ------------ задача 5--------------
  218.  
  219.         sayminarea(root1);
  220.         // ------------ задача 6--------------
  221.         saymaxlevel(root2, "Г"); // второе дерево , ищем высоту начинающегося с "Г"
  222.  
  223.  
  224.         // ------------ задача 7--------------
  225.  
  226.         clear(&root1); //Вызов функции очистки дерева
  227.         if (!root1) cout << "Дерево успешно очищено!" << endl;
  228.         clear(&root2); //Вызов функции очистки дерева
  229.         if (!root2) cout << "Дерево успешно очищено!" << endl;
  230.  
  231.  
  232.  
  233.  
  234.         delete[] mas;
  235.     }
  236.     else cout << "Размер массива равен 0" << endl;
  237.     return 0;
  238. }
  239.  
Advertisement
Add Comment
Please, Sign In to add comment