Синергия, Структуры и алгоритмы компьютерной обработки данных, задание 2

Раздел
Программирование
Просмотров
244
Покупок
2
Антиплагиат
Не указан
Размещена
28 Янв в 13:47
ВУЗ
Синергия
Курс
2 курс
Стоимость
200 ₽
Демо-файлы   
1
pdf
4_algo_dzdocx
1.5 Мбайт
Файлы работы   
1
Каждая работа проверяется на плагиат, на момент публикации уникальность составляет не менее 40% по системе проверки eTXT.
docx
задание 2
122.3 Кбайт 200 ₽
Описание

Решение Задание №2

Оглавление

Задание №2

Напишите свою реализацию бинарного дерева поиска. Должны быть реализованы методы добавления элементов, удаления элементов, поиска элемента

1. Определите класс, пропишите поля и сигнатуры методов. Поскольку наши методы будут напрямую работать с узлами дерева, то они должны быть закрытыми, то есть приватными. Поэтому нужно будет реализовать публичные методы, которые вызывают соответствующие приватные.

#include <iostream>

class BinarySearchTree {

public:

// Конструктор для создания пустого дерева

BinarySearchTree() : root(nullptr) {}

// Публичный метод для вставки нового значения в дерево

void insert(int value) {

root = insert(root, value);

}

// Публичный метод для удаления значения из дерева

void remove(int value) {

root = remove(root, value);

}

// Публичный метод для поиска значения в дереве

bool search(int value) {

return search(root, value) != nullptr;

}

// Публичный метод для печати дерева в консоль

void print() {

inorder();

std::cout << std::endl;

}

private:

// Определение структуры узла дерева

struct Node {

};

Node* root; // Корень дерева

// Приватный метод для вставки нового значения в дерево

Node* insert(Node* root, int value) {

// ...

}

// Приватный метод для удаления значения из дерева

Node* remove(Node* root, int value) {

// ...

}

// Приватный метод для поиска значения в дереве

Node* search(Node* root, int value) {

// ...

}

// Приватный метод для печати узлов дерева в порядке возрастания

void inorder() {

// ...

}

};

2. Определите структуру узла дерева, которая будет содержать значение узла и указатели на левого и правого потомка. Создайте функцию для создания нового узла с заданным значением.

// Определение структуры узла дерева

struct Node {

int value; // Значение узла

Node* left; // Указатель на левого потомка

Node* right; // Указатель на правого потомка

// Конструктор для создания нового узла с заданным значением

Node(int value) : value(value), left(nullptr), right(nullptr) {}

};

3. Создайте функцию для вставки нового узла в дерево. Эта функция должна принимать корень дерева и значение нового узла в качестве аргументов и возвращать новый корень дерева.

// Приватный метод для вставки нового значения в дерево

Node* insert(Node* root, int value) {

// Если дерево пустое, создаем новый корень

if (root == nullptr) {

return new Node(value);

}

// Если значение меньше значения корня, вставляем его в левое поддерево

if (value < root->value) {

root->left = insert(root->left, value);

} // Иначе вставляем его в правое поддерево

else {

root->right = insert(root->right, value);

}

// Возвращаем новый корень дерева

return root;

}

4. Создайте функцию для поиска значения в дереве. Эта функция должна принимать корень дерева и значение для поиска в качестве аргументов и возвращать указатель на узел с этим значением или nullptr, если значение не найдено.

// Приватный метод для поиска значения в дереве

Node* search(Node* root, int value) {

// Если дерево пустое или значение найдено, возвращаем корень

if (root == nullptr || root->value == value) {

return root;

}

// Если значение меньше значения корня, ищем его в левом поддереве

if (value < root->value) {

return search(root->left, value);

} // Иначе ищем его в правом поддереве

else {

return search(root->right, value);

}

}

5. Создайте функцию для удаления узла из дерева. Эта функция должна принимать корень дерева и значение для удаления в качестве аргументов и возвращать новый корень дерева. Так как нам нужно сохранить свойства бинарного дерева, то для удаления элементов с обоими детьми нам понадобится вспомогательный метод, который ищет преемника. В качестве преемника будем выбирать наименьший элемент левого поддерева.

// Приватный метод для нахождения узла с минимальным значением в дереве

Node* findMin(Node* root) {

while (root->left != nullptr) {

root = root->left;

} return root;

}

// Приватный метод для удаления значения из дерева

Node* remove(Node* root, int value) {

// Если дерево пустое, возвращаем nullptr

if (root == nullptr) {

return nullptr;

}

// Если значение меньше значения корня, удаляем его из левого поддерева

if (value < root->value) {

root->left = remove(root->left, value);

} // Если значение больше значения корня, удаляем его из правого поддерева

else if (value > root->value) {

root->right = remove(root->right, value);

} // Иначе удаляем корень

else {

// Если у корня нет потомков или только один потомок

if (root->left == nullptr) {

Node* temp = root->right;

delete root;

return temp;

}

else if (root->right == nullptr) {

Node* temp = root->left;

delete root;

return temp;

} // Если у корня есть оба потомка

else {

// Находим узел с минимальным значением в правом поддереве

Node* temp = findMin(root->right);

// Копируем значение этого узла в корень

root->value = temp->value;

// Удаляем этот узел из правого поддерева

root->right = remove(root->right, temp->value);

}

}

// Возвращаем новый корень дерева

return root;

}

6. Создайте функцию для печати узлов дерева в порядке возрастания. Так как эта функция должна осуществлять обход дерева в глубину, что делается рекурсивно, то нам понадобится функция-помощник.

// Приватный метод для печати узлов дерева в порядке возрастания

void inorder() {

inorderHelper(root);

}

// Приватный рекурсивный метод-помощник для печати

void inorderHelper(Node* root) {

// Если дерево не пустое

if (root != nullptr) {

// Обходим левое поддерево

inorderHelper(root->left);

// Печатаем значение корня

std::cout << root->value << ' ';

// Обходим правое поддерево

inorderHelper(root->right);

}

}

7. Добавьте тесты в функцию main(), в итоге у Вас должен получиться следующий код:

 Протестируйте программу на своих тестах. Отправьте преподавателю скриншот консоли.

Вам подходит эта работа?
Похожие работы
Другие работы автора
Проектно-сметная документации
Тест Тест
14 Сен в 21:17
15
0 покупок
Управление проектами
Тест Тест
14 Сен в 03:13
36 +2
0 покупок
Управление проектами
Тест Тест
13 Сен в 01:04
28
0 покупок
Анализ и прогнозирование
Тест Тест
26 Авг в 14:45
30
0 покупок
Инвестиционный менеджмент
Тест Тест
25 Авг в 14:48
31
0 покупок
Финансы
Тест Тест
11 Авг в 14:17
222 +1
3 покупки
Стратегический маркетинг
Тест Тест
4 Авг в 13:07
62 +2
0 покупок
Информационные системы
Тест Тест
13 Июл в 17:16
80
1 покупка
Обучение нейронных систем
Тест Тест
13 Июл в 12:25
83
0 покупок
Информационные системы
Тест Тест
10 Июл в 16:03
145
1 покупка
Финансовое право
Тест Тест
9 Июл в 11:38
71
8 покупок
Рынок ценных бумаг
Тест Тест
8 Июл в 16:29
112
10 покупок
Менеджмент
Тест Тест
8 Июл в 15:39
82
4 покупки
Корпоративные финансы
Тест Тест
8 Июл в 15:18
65
4 покупки
Анализ и прогнозирование
Тест Тест
2 Июл в 20:32
83
2 покупки
АФХД - Анализ финансово-хозяйственной деятельности
Тест Тест
2 Июл в 08:45
161
13 покупок
Бухгалтерская и налоговая отчетность
Тест Тест
2 Июл в 03:45
97
7 покупок
Основы программирования
Тест Тест
22 Июн в 14:22
149 +1
6 покупок
Управление проектами
Тест Тест
14 Июн в 15:23
87
0 покупок
Темы журнала
Показать ещё
Прямой эфир