Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <malloc.h>
- #include <math.h>
- struct bi_tree // Структура элемента бинарного дерева
- {
- struct tree *left; //Указатель на левый узел
- int key; //Ключ в узле дерева
- struct tree *right; //Указатель на правый узел
- }bi_tree, *ptr, *ptr1, *root; //Название структуры, два указателя и указатель на корень
- void TreeCreation(int *tree_exists); //Создание бинарного дерева
- void ElementSearch(int *tree_exists); //Поиск конкретного ключа
- void AddingElement(int *tree_exists); //Добавление узла
- void Bypass(struct bi_tree *root1); //Прямой обход дерева
- void SearchMax(int *tree_exists); //Поиск наибольшего элемента
- void DeleteElement(int *tree_exists); //Удаление узла дерева без дочерних узлов
- void printTree(struct bi_tree *treePtr, int s);
- void main()
- {
- int chs;
- int tree_exists = 0; //Флаг, сообщающий о наличии или отсутствии дерева. 0 - дерева нет, 1 - дерево есть
- while (1) //Цикл меню
- {
- printf("Choose function.\n1 - create tree.\n2 - searching key.\n3 - adding new element.\n4 - direct bypass.\n5 - searching max element\n6 - delete one element without any descendants.\n7 - print tree.\n0 - exit.\n");
- scanf("%d", &chs); //Ввод клавиши действия
- switch (chs)
- {
- case 1: //Создание бинарного дерева
- {
- TreeCreation(&tree_exists);
- break;
- }
- case 2: //Поиск конкретного ключа
- {
- ElementSearch(&tree_exists);
- break;
- }
- case 3: //Добавление узла
- {
- AddingElement(&tree_exists);
- break;
- }
- case 4: //Прямой обход дерева
- {
- if (tree_exists == 1) //Если дерево создано - выполнить обход
- {
- Bypass(root);
- printf("\n");
- break;
- }
- else if (tree_exists == 0) //Если дерево не создано - сообщить об этом
- {
- printf("Binary tree doesn't exist. Please create it.");
- }
- }
- case 5: //Поиск наибольшего элемента
- {
- SearchMax(&tree_exists);
- break;
- }
- case 6: //Удаление узла дерева без дочерних узлов
- {
- DeleteElement(&tree_exists);
- break;
- }
- case 7:
- {
- if (tree_exists == 1) //Если дерево создано - выполнить обход
- {
- int s = 0;
- printf("\n\n\n\n\n\nTree:\n");
- printTree(root, s);
- break;
- }
- else if (tree_exists == 0) //Если дерево не создано - сообщить об этом
- {
- printf("Binary tree doesn't exist. Please create it.");
- }
- }
- case 0: //Выход из программы
- {
- printf("Exiting program.\n"); //Выход из программы
- break;
- }
- default: //Если выбранной команды не существует
- {
- printf("This feature doesn't exist. Please try again.\n");
- break;
- }
- }
- if (chs == 0)
- break;
- }
- }
- void TreeCreation(int *tree_exists) //Создание бинарного дерева
- {
- FILE *in;
- int i;
- int temp;
- if (*tree_exists == 1) //Если дерево существует - об этом сообщается
- {
- printf("Tree is already created. Please delete it before.\n");
- }
- else //Иначе
- {
- in = fopen("C:\\test\\SiAODlab5Input.txt", "rt"); //Открываем файл с целочисленной числовой последовательностью в режиме чтения
- if (in == NULL) //Если файл открыть не удалось - выводится сообщение об этом
- {
- printf("Initial file wasn't opened.\n");
- return -1;
- }
- root = malloc(sizeof(struct bi_tree)); //Выделение памяти под корень
- root->left = NULL; //Обнуление указателя на левый потомок
- root->right = NULL; //Обнуление указателя на правый потомок
- fscanf(in, "%d", &temp); //Ввод ключа узла дерева в переменную временного хранения
- root->key = temp; //Запись ключа в узел
- for (i = 1; i < 25; i++) //Создание остальных 24 элементов дерева
- {
- ptr = malloc(sizeof(struct bi_tree)); //Выделение памяти под узел
- ptr->left = NULL; //Обнуление указателя на левый потомок
- ptr->right = NULL; //Обнуление указателя на правый потомок
- fscanf(in, "%d", &temp); //Ввод ключа узла дерева в переменную временного хранения
- ptr->key = temp; //Запись ключа в узел
- ptr1 = root; //Переходим к корню дерева
- while (1)
- {
- if (ptr1->key > ptr->key) //Ключ просматриваемого узла больше ключа добавляемого узла? Если да:
- {
- if (ptr1->left == NULL) //Если левый потомок не существует (проверяется путем проверки равности NULL указателя на левый потомок)
- {
- ptr1->left = ptr; //Добавляемый узел становится левым потомком просматриваемого сейчас узла
- break;
- }
- else //Иначе
- {
- ptr1 = ptr1->left; //Переходим в левый потомок
- }
- }
- else if (ptr1->key < ptr->key) //Если нет: ключ просматриваемого узла меньше ключа добавляемого узла? Если да:
- {
- if (ptr1->right == NULL) //Если правый потомок не существует (проверяется путем проверки равности NULL указателя на правый потомок)
- {
- ptr1->right = ptr; //Добавляемый узел становится правым потомком просматриваемого сейчас узла
- break;
- }
- else //Иначе
- {
- ptr1 = ptr1->right; //Переходим в правый потомок
- }
- }
- }
- }
- printf("Binary tree was successfully created.\n"); //Вывод сообщения об успешном создании дерева
- *tree_exists = 1; //Флаг мпереходит в состояние 1
- fclose(in); //Закрытие файла
- }
- }
- void ElementSearch(int *tree_exists) //Поиск конкретного ключа
- {
- int skey;
- int search = 0;
- if (*tree_exists == 0) //Если дерево не создано - сообщаем об этом
- {
- printf("Binary tree doesn't exist. Please create it.");
- }
- else //Иначе
- {
- printf("Enter the key for searching.\n");
- scanf("%d", &skey); //Вводим искомый ключ
- ptr = root; //Переходим к корню дерева
- while (1)
- {
- if (skey == ptr->key) //Если ключ найден - выводим сообщение об этом, на какой стороне относительно корня находится ключ, и информацию о ево потомках
- {
- printf("Key %d was found. It is on the", skey);
- if (skey < root->key)
- {
- printf(" left ");
- }
- else
- {
- printf(" right ");
- }
- printf("of the root.");
- printf(" Left descendant is");
- if (ptr->left == NULL)
- {
- printf(" not exist "); //Если левого потомка нет - выводим сообщение об этом
- }
- else
- {
- ptr1 = ptr->left;
- printf(" %d ", ptr1->key); //Иначе - выводим его ключ
- }
- printf("and right descendant is");
- if (ptr->right == NULL)
- {
- printf(" not exist.\n"); //Если правого потомка нет - выводим сообщение об этом
- }
- else
- {
- ptr1 = ptr->right;
- printf(" %d.\n", ptr1->key); //Иначе - выводим его ключ
- }
- search = 1;
- break;
- }
- else if (skey < ptr->key) //Если ключ меньше проверяемого узла, переходим в левый потомок
- {
- if (ptr->left != NULL)
- (ptr = ptr->left);
- else
- break;
- }
- else if (skey > ptr->key) //Если ключ больше проверяемого узла, переходим в правый потомок
- {
- if (ptr->right != NULL)
- (ptr = ptr->right);
- else
- break;
- }
- }
- if (search == 0)
- {
- printf("Key wasn't found. It's not an element of tree.\n");
- }
- }
- }
- void AddingElement(int *tree_exists) //Добавления узла
- {
- int new;
- if (*tree_exists == 0) //Если дерево не создано - сообщаем об этом
- {
- printf("Binary tree doesn't exist. Please create it.");
- }
- else //Иначе
- {
- printf("Enter new element.\n");
- scanf("%d", &new); //Вводим значение ключа нового узла
- ptr = malloc(sizeof(struct bi_tree)); //Выделение памяти под узел
- ptr->left = NULL; //Обнуление указателя на левый потомок
- ptr->right = NULL; //Обнуление указателя на правый потомок
- ptr->key = new; //Запись данных в узел
- ptr1 = root; //Переходим к корню дерева
- while (1)
- {
- if (ptr->key > ptr1->key) //Ключ просматриваемого узла больше ключа добавляемого узла? Если да:
- {
- if (ptr1->right == NULL) //Если левый потомок не существует (проверяется путем проверки равности NULL указателя на левый потомок)
- {
- ptr1->right = ptr; //Добавляемый узел становится левым потомком просматриваемого сейчас узла
- printf("Element was successfully added.\n");
- break;
- }
- else //Иначе
- ptr1 = ptr1->right; //Переходим в левый потомок
- }
- else if (ptr->key < ptr1->key) //Ключ просматриваемого узла меньше ключа добавляемого узла? Если да:
- {
- if (ptr1->left == NULL) //Если правый потомок не существует (проверяется путем проверки равности NULL указателя на правый потомок)
- {
- ptr1->left = ptr; //Добавляемый узел становится правым потомком просматриваемого сейчас узла
- printf("Element was successfully added.\n");
- break;
- }
- else //Иначе
- ptr1 = ptr1->left; //Переходим в правый потомок
- }
- else if (ptr1->key == ptr->key) //Если найден такой же ключ - вывод сообщение об этом
- {
- printf("This element is already part of tree. Add another element.\n");
- break;
- }
- }
- }
- }
- void Bypass(struct bi_tree* root1) //Прямой обход дерева
- {
- if (root1) //Начиная с корня, проходим по всем узлам
- {
- printf("%d ", root1->key); //Выводим ключ текущего проверяемого узла
- Bypass(root1->left); //Проходим через все левые поддеревья данного узла
- Bypass(root1->right); //Проходим через все правые поддеревья данного узла
- }
- }
- void SearchMax(int *tree_exists) //Поиск наибольшего элемента
- {
- if (*tree_exists == 0) //Если дерево не создано - сообщаем об этом
- {
- printf("Binary tree doesn't exist. Please create it.");
- }
- else
- {
- ptr = root; //Переходим к корню дерева
- while (1)
- {
- if (ptr->right != NULL) //До тех пор, пока указатель на правого потомка не станет равен NULL, переходим в правого потомка.
- ptr = ptr->right;
- else //Узел с указателем на правого потомка, равным NULL, и будет наибольшим элементом дерева
- {
- printf("Max element of binary tree is %d.\n", ptr->key);
- break;
- }
- }
- }
- }
- void DeleteElement(int *tree_exists) //Удаление узла дерева без дочерних узлов
- {
- if (*tree_exists == 0) //Если дерево не создано - сообщаем об этом
- {
- printf("Binary tree doesn't exist. Please create it.");
- }
- else
- {
- int l_r = 0;
- if (root->left == NULL && root->right == NULL) //Если потомки у корня отсутствуют - удаляем его и,как следствие, дерево
- {
- printf("Root was the last element of the tree. Tree was deleted.\n");
- *tree_exists = 0; //Флаг существования дерева переводим в 0
- ptr = NULL;
- ptr1 = NULL;
- free(root);
- }
- else
- {
- ptr = root;
- while (1)
- {
- if (ptr->left != NULL) //Перемещаемся в левый потомок в случае его наличия
- {
- ptr1 = ptr;
- ptr = ptr1->left;
- l_r = 0;
- }
- else if (ptr->right != NULL) //В случае наличия правого потомка и отсутствия левого потомка, перемещаемся в потомок потомок
- {
- ptr1 = ptr;
- ptr = ptr1->right;
- l_r = 1;
- }
- else
- break;
- }
- if (l_r == 0) //Если удаляемый узел - левый потомок своего предка, очищаем указатель на левый потомок предка и удаляем узел
- {
- ptr1->left = NULL;
- free(ptr);
- printf("Element was successfully deleted.\n");
- }
- else //Если удаляемый узел - правый потомок своего предка, очищаем указатель на правый потомок предка и удаляем узел
- {
- ptr1->right = NULL;
- free(ptr);
- printf("Element was successfully deleted.\n");
- }
- }
- }
- }
- void printTree(struct bi_tree *treePtr, int s)
- {
- int i;
- if (treePtr != NULL)
- {
- printTree(treePtr->right, s + 3);
- for (i = 0; i < s; i++)
- {
- printf(" ");
- }
- printf("%3d\n", treePtr->key);
- printTree(treePtr->left, s + 3);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement