
2392_Смирнова_М_ЛР6
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра АПУ
отчет
по лабораторной работе 6
по дисциплине «Алгоритмы и структуры данных»
ТЕМА: «Дерево и операции с ним»
Студентка гр. 2392 |
|
Смирнова М. В. |
Преподаватель |
|
Ряскова Е. Б. |
Санкт-Петербург
2023
Постановка задачи.
Написать функцию для построения упорядоченного бинарного дерева из множества, вводимого из клавиатуры. Число элементов множества также задается с клавиатуры.
Вывести полученное дерево с использованием различных вариантов обхода: прямой, симметричный, обратный.
Ход решения.

Struct derevo: создана структура «дерево». Создана вложенная структура el_derevo (элемент дерева) с указателями на левый, правый, предыдущий узел списка. Функция создания элемента дерева, инициализирующий поля.

Void ENTER_in_derevo: функция вставки узлов в дерево, для левого поддерева – в случае пустого, то вставление нового элемента, в любом другом случае рекурсивное добавление, – для правого поддерева аналогично как и для левого.

Void PREF_d_print: Функция прямого обхода: пока не встретится пустой узел, отображаем корень дерева и выполняем рекурсивные функции для левого и правого поддерева.
Void INF_d_print: Функция INF аналогично выполняется, как и PREF, только порядок действий идет в другом порядке: сначала рекурсия для левого поддерева, затем вывод корня, после чего рекурсия для правого поддерева.
Void POST_d_print: Функция POST аналогично выполняется, как и PREF, только порядок действий идет в другом порядке: сначала рекурсия для левого поддерева, затем рекурсия для правого поддерева, после чего вывод элемента.

Void DELETE_d: Функция удаления дерева. В случае если корень пуст – return. Удаляем левое и правое поддерево, удаляем текущий узел, далее устанавливаем корень как null.

Int MAIN: Просим от пользователя ввести корень дерева, а также размерность. Инициализируем структуру дерева и просим от пользователя заполнить ее через цикл. Далее выводим на экран тремя способами. После выполнения работы удаляем дерево.

Результат работы
Вывод
Благодаря проведенной лабораторной работы были получены практически навыки реализации деревьев и операций над ними. Была написана функция для построения упорядоченного бинарного дерева из множества, вводимого из клавиатуры. Были изучены варианты обхода дерева: прямой, симметричный, обратный. Они были реализованы на практике с полученным деревом.
Приложение
#include <iostream>
using namespace std;
struct derevo {
typedef struct el_derevo{
el_derevo* left;
el_derevo* right;
el_derevo* prev;
int value;
}el_derevo;
el_derevo* root;
el_derevo* CREATE_el_derevo(int i){
el_derevo* elem = new el_derevo;
elem->value = i;
elem->left = NULL;
elem->right = NULL;
elem->prev = NULL;
return elem;}
derevo(int i) {
root = CREATE_el_derevo(i);}
void
ENTER_in_derevo(el_derevo* root, el_derevo* elem){
if (elem->value < root->value) {
if (root->left == NULL) {
root->left = elem;
elem->prev = root;}
else {
ENTER_in_derevo(root->left, elem);}}
else {
if (root->right == NULL) {
root->right = elem;
elem->prev = root;}
else {
ENTER_in_derevo(root->right, elem);}}}
void PREF_d_print(el_derevo* tree) {
if (tree != NULL) {
cout << tree->value << " ";
PREF_d_print(tree->left);
PREF_d_print(tree->right);}}
void INF_d_print(el_derevo* tree) {
if (tree != NULL) {
INF_d_print(tree->left);
cout << tree->value << " ";
INF_d_print(tree->right);}}
void POST_d_print(el_derevo* tree) {
if (tree != NULL) {
POST_d_print(tree->left);
POST_d_print(tree->right);
cout << tree->value << " "; }}
void DELETE_d(el_derevo*& root){
if (root == nullptr) {
return;}
DELETE_d(root->left);
DELETE_d(root->right);
delete root;
root = nullptr;}};
int main(){
int item = 0;
cout << "Write down the root of the tree! Here: ";
cin >> item;
cout << endl;
derevo Tr(item);
int size = 0;
cout << "How many items will be recorded in the tree? Write it here: ";
cin >> size;
cout << endl;
cout << "Enter items: ";
for (int i = 0; i < size - 1; i++){
cin >> item;
Tr.ENTER_in_derevo(Tr.root, Tr.CREATE_el_derevo(item));}
cout << endl;
int form = 0;
cout << "DIRECT:" << endl;
Tr.PREF_d_print(Tr.root);
cout << endl;
cout << "SYMMETRICAL:" << endl;
Tr.INF_d_print(Tr.root);
cout << endl;
cout << "REVERSE" << endl;
Tr.POST_d_print(Tr.root);
Tr.DELETE_d(Tr.root);
return 0;
}