Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2022, 20:45   #1
MaxBrat
Пользователь
 
Регистрация: 27.09.2022
Сообщений: 32
Восклицание

Написать программу создание и использование бинарного дерева поиска, при помощи шаблона map.

У меня есть код на C++. Нужно его переделать так чтобы в нём использовалась основные функции шаблону map.

Код:
#include <iostream>

// Структура ноды
struct node
{
	int key_value; // Значение каждого листа
	node* left; // Указатель на левую часть
	node* right; // Указатель на правую часть
};

// Класс бинарного дерева
class bitree
{
private:
	node* root; // Корень дерева

	// Добавление в дерево нового листа
	void add(int key, node* leaf)
	{
		if (key < leaf->key_value) // Добавление в левую сторону
		{
			if (leaf->left != NULL) // Если это не конец ветви
				add(key, leaf->left);
			else
			{
				leaf->left = new node;
				leaf->left->key_value = key;
				leaf->left->left = NULL;
				leaf->left->right = NULL;
			}
		}
		else if (key >= leaf->key_value) // Добаление в правую сторону
		{
			if (leaf->right != NULL)
				add(key, leaf->right);
			else
			{
				leaf->right = new node;
				leaf->right->key_value = key;
				leaf->right->left = NULL;
				leaf->right->right = NULL;
			}
		}
	}

	// Поиск элемента в дереве, возвращает указатель на искомый элемент(лист)
	node* search(int key, node* leaf)
	{
		if (leaf != NULL)
		{
			if (key == leaf->key_value)
				return leaf;
			if (key < leaf->key_value)
				return search(key, leaf->left);
			else
				return search(key, leaf->right);
		}
		else
		{
			std::cout << "\nElement not found.\n";
			return NULL;
		}
	}

	// Вывод дерева графически
	void show(node* leaf, int n)
	{
		if (leaf)
		{
			show(leaf->left, n + 5);
			for (int i{}; i < n; i++)
				std::cout << " ";
			std::cout << leaf->key_value << '\n';
			show(leaf->right, n + 5);
		}
	}

public:

	// Конструктор класса
	bitree()
	{
		root = NULL;
	}

	// Деструктор класса
	~bitree()
	{
		del_tree();
	}

	// Получение корня дерева
	node* start()
	{
		return root;
	}

	// Очистка дерева полностью
	void del_tree()
	{
		del_tree(root);
	}

	// Удаление c указанного листа дерева
	void del_tree(node* leaf)
	{
		if (leaf != NULL)
		{
			del_tree(leaf->left);
			del_tree(leaf->right);
			delete leaf;
		}
	}

	// Добавление элемента (функция доступная пользователю)
	void add(int key)
	{
		if (root != NULL)
			add(key, root);
		else // Если добавляемый элемент -- первый в дереве
		{
			root = new node;
			root->key_value = key;
			root->left = NULL;
			root->right = NULL;
		}
	}

	// Поиск элемента в дереве 
	node* search(int key)
	{
		return search(key, root);
	}

	// Вывод всего дерева 
	void show()
	{
		show(root, 0);
	}
};

int findMaxDepth(node* root) { //Функция нахождения глубины дерева
	if (root == NULL) {
		return 0;
	}
	// найти минимальную глубину левого поддерева
	int l = findMaxDepth(root->left);

	// находим минимальную глубину правого поддерева
	int r = findMaxDepth(root->right);

	// если левого дочернего элемента не существует, считаем глубину
	// возвращает правое поддерево
	if (root->left == nullptr) {
		return 1 + r;
	}

	// если нужного потомка не существует, учитываем глубину
	// возвращает левое поддерево
	if (root->right == nullptr) {
		return 1 + l;
	}

	// в противном случае выбираем максимальную глубину, возвращаемую
	// левое и правое поддерево
	return std::max(l, r) + 1;
}

int main()
{
	bitree tree; // Создаём бинарное дерево

	std::cout << "How many elements in a tree? ";
	int x{};
	std::cin >> x;

	int temp{};
	for (int i{}; i < x; i++) // Ввводим данные в дерево
	{
		std::cout << i + 1 << ". ";
		std::cin >> temp;
		tree.add(temp);
	}

	tree.show(); // Выводим всё дерево
	std::cout << "\nBinary tree depth: " << findMaxDepth(tree.start()) << '\n';
	return 0;
}

Последний раз редактировалось BDA; 09.11.2022 в 08:03.
MaxBrat вне форума Ответить с цитированием
Старый 09.11.2022, 07:23   #2
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 965
По умолчанию

MaxBrat, std::map::find - уже всё готово
Алексей1153 вне форума Ответить с цитированием
Старый 09.11.2022, 16:55   #3
MaxBrat
Пользователь
 
Регистрация: 27.09.2022
Сообщений: 32
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
MaxBrat, std::map::find - уже всё готово
Тоесть в этом коде всё ок?
MaxBrat вне форума Ответить с цитированием
Старый 09.11.2022, 17:19   #4
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 965
По умолчанию

MaxBrat, да, в этой стандартной функции std::map::find - всё ок.
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно перевести небольшой логический калькулятор с Python на С++ Cyber_Dezz Помощь студентам 7 18.06.2020 03:34
Требуеться написать небольшой софт onelife Фриланс 2 18.09.2015 11:21
Нужно сделать VBA скрипт небольшой для exel. neks Фриланс 1 18.03.2014 01:24
Написать небольшой тест на дельфи Jeka_727211 Помощь студентам 1 11.05.2010 14:17