Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <iomanip>
- #include <string.h>
- #include <windows.h>
- using namespace std;
- struct Countries {
- string name; //название страны
- string capital; //столица
- double population; //численность населения
- double populationPercent; //процент населения от общемирового
- double area; //площадь
- };
- struct node // описание узла дерева
- {
- Countries countries;// поле данных - переменная типа страна
- node* left, * right; // указатели на левое и правое поддеревья
- };
- struct qnode{
- Countries info;
- qnode *next;
- };
- void push(qnode **start, qnode **end, Countries &d){
- qnode *p = new qnode;
- p->info = d;
- p->next = nullptr;
- if(*end){
- (*end)->next = p;
- }else{
- (*start) = p;
- }
- *end = p;
- }
- void print(qnode *start){
- cout << "\n";
- while(start!= nullptr){
- // cout << start->info << "\n";
- start = start->next;
- }
- }
- void uni(qnode **s, qnode **e, qnode *s1, qnode *s2){
- qnode* p1 = s1;
- qnode* p2 = s2;
- while(p1 != nullptr){
- push(s, e, p1->info);
- p1 = p1->next;
- }
- while(p2 != nullptr){
- push(s, e, p2->info);
- p2 = p2->next;
- }
- }
- void inputstudent(Countries& countries)//ввод данных о студенте
- {
- cout << "Введите название страны: " << endl;
- cin >> countries.name;
- cout << "Введите столицу:" << endl;
- cin >> countries.capital;
- cout << "Введите численность населения:" << endl;
- cin >> countries.population;
- cout << "Введите процент населения от общемирового:" << endl;
- cin >> countries.populationPercent;
- cout << "Введите площадь:" << endl;
- cin >> countries.area;
- }
- //ввод массива с клавиатуры
- void inputMasFromKeyboard(Countries*& mas, qnode*& q, unsigned int& size)
- {
- cout << "Введите размер массива" << endl;
- cin >> size;
- if (size == 0) return;//если размер=0, то выходим из функции
- mas = new Countries[size];//создаем динамический массив
- int i;//индекс элемента массива
- for (i = 0; i < size; i++)
- {
- cout << "Введите информацию о стране:" << endl;
- inputstudent(q->info);
- q = q->next;
- }
- }
- void printStudent(Countries countries)//печать данных о студенте
- {
- cout << left << setw(10) << countries.name << setw(15) << countries.capital << setw(10) << countries.population << setw(9)
- << countries.populationPercent << setw(5) << countries.area << endl;;
- }
- void printMas(Countries* mas, qnode *q1, unsigned int size)
- {
- if (!size) return;
- cout << "Созданный массив с информацией о странах:" << endl;
- cout << left << setw(10) << "Название" << setw(15) << "Столица" << setw(10) << "Числ.населения" << setw(9)
- << "Процент населения" << setw(5) << "Площадь" << endl;
- for (int i = 0; i < size; i++)
- {
- printStudent(q1->info);
- q1 = q1->next;
- }
- }
- void insert(node** p, Countries countries) // добавление узла в дерево поиска
- {
- if (*p == NULL)//или (!*p) //нашли пустой указатель – пустое место
- { //создаём новый узел дерева на найденном месте
- *p = new node;
- (*p)->countries = countries;
- (*p)->left = NULL;
- (*p)->right = NULL;
- }
- else
- { //если текущий узел не пуст
- if (countries.name < (*p)->countries.name) insert(&(*p)->left, countries); //идём в левое поддерево
- if (countries.name > (*p)->countries.name) insert(&(*p)->right, countries); //идём в правое поддерево
- //одинаковые значения не добавляем!
- }
- }
- // распечатка дерева в симметричном порядке
- void printsim(const node* p)
- {
- if (p != NULL) // если дерево не пусто
- {
- printsim(p->left); // печатаем левое поддерево
- printStudent(p->countries); // печатаем значение поля - всю структуру типа tstudent
- printsim(p->right); // печатаем правое поддерево
- }
- }
- void clear(node** p) // очистка дерева
- {
- if ((*p) != NULL) // если дерево не пусто
- {
- clear(&(*p)->left); // удаляем левое поддерево
- clear(&(*p)->right); // удаляем правое поддерево
- delete* p; //Удаляем указатель на текущий узел
- *p = NULL;//Присваиваем ему пустой указатель
- }
- }
- //функция создания деревьев из массива
- void createTrees(Countries* mas, qnode* q1, unsigned int size, node** root1, node** root2)
- {
- if (!size) return;
- for (int i = 0; i < size; i++)
- {
- if (q1->info.population > 100) insert(root1, q1->info); // Добавляем новый узел в первое дерево поиска
- else insert(root2, q1->info); // Добавляем новый узел в первое дерево поиска
- }
- }
- //нахождение количества узлов
- int count(const node* p)
- {
- if (p == NULL) return 0;
- return 1 + count(p->left) + count(p->right);
- }
- // высота дерева
- int height(const node* p)
- {
- if (p == NULL) return 0;
- //иначе
- int h1 = height(p->left);//считаем высоту левого поддерева
- int h2 = height(p->right);//считаем высоту правого поддерева
- if (h1 >= h2) return h1 + 1;//возвращаем высоту большего из них+1 - так как добавляем наш узел
- return h2 + 1;
- }
- //печать значений узлов из самой длинной ветки
- void printLong(const node* p)
- {
- if (p != NULL)
- {
- printStudent(p->countries);
- int h1 = height(p->left);
- int h2 = height(p->right);
- if (h1 >= h2) printLong(p->left);
- else printLong(p->right);
- }
- }
- double sayminarea(const node *p ){
- if (p != NULL) // если дерево не пусто
- {
- double s1 = sayminarea(p->left); // печатаем левое поддерево
- double s2 = sayminarea(p->right); // печатаем правое поддерево
- return min(p->countries.area, min(s1, s2)); // минимальная площадь поддеревьев.
- }
- return 100000000; //
- }
- int saymaxlevel(const node *p, string s){
- //height
- if (p != NULL) // если дерево не пусто
- {
- int s1 = saymaxlevel(p->left, s); // печатаем левое поддерево
- int s2 = saymaxlevel(p->right, s); // печатаем правое поддерево
- if(p->countries.name[0] == s[0]){
- return max(height(p), max(s1, s2)); // минимальная площадь поддеревьев
- }
- return max(s1, s2);
- }
- return 0 ;
- }
- int main() {
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- Countries* mas = NULL;//указатель на динамический массив типа Студент
- unsigned int size = 0;
- qnode* q1 = NULL;
- inputMasFromKeyboard(mas, q1, size);
- if (size) {
- node* root1 = NULL, * root2 = NULL; // Указатели на корень первого и второго деревьев
- printMas(mas, q1, size);
- cout << endl;
- createTrees(mas, q1, size, &root1, &root2);
- cout << "Распечатка первого дерева в симметричном порядке" << endl;
- printsim(root1); // распечатка первого дерева в симметричном порядке
- cout << endl;
- cout << "Распечатка второго дерева в симметричном порядке" << endl;
- printsim(root2); // распечатка второго дерева в симметричном порядке
- cout << endl;
- cout << "Количество узлов первого дерева " << count(root1) << endl;
- cout << endl;
- cout << "Узлы длинной ветки:" << endl;
- printLong(root2);
- // ------------ задача 5--------------
- sayminarea(root1);
- // ------------ задача 6--------------
- string s;
- cin >> s;
- saymaxlevel(root2, s); // второе дерево , ищем высоту начинающегося с "Г"
- // ------------ задача 7--------------
- clear(&root1); //Вызов функции очистки дерева
- if (!root1) cout << "Дерево успешно очищено!" << endl;
- clear(&root2); //Вызов функции очистки дерева
- if (!root2) cout << "Дерево успешно очищено!" << endl;
- delete[] mas;
- }
- else cout << "Размер массива равен 0" << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment