Вот задание:
1) преобразование структур в дерево поиска;
Что такое дерево поиска, я понял, но подскажите,пожалуйста, как это реализовать, желательно с каким-нибудь примером.
У нас есть какая-то структура, например структура "слово". Она может содержать различные поля, для простоты здесь только массив char
struct Word
{
char key[100];
};
Согласно первому пункту задания, преобразуем эту структуру в узел бинарного дерева поиска. Узел бинарного дерева будет хранить ключ ( уже есть массив char), значение и указатели на правого-левого ребенка.
Вот что вышло:
struct Word
{
char key[100];
size_t value;
Word * left;
Word * right;
};
Структура "слово" у нас есть, поработаем с текстом.
Задача: для каждого слова в тексте подсчитать, сколько раз оно там встречается
Решение: Будем вставлять в дерево слова из текста с соблюдением свойства упорядоченности .
С Википедии:
У всех узлов левого поддерева произвольного узла X значения ключей
данных меньше, нежели значение ключа данных самого узла X.
У всех
узлов правого поддерева произвольного узла X значения ключей данных
больше либо равны, нежели значение ключа данных самого узла X.
Одновременно считаем слова таким образом: если слово в дереве
еще не встречалось, то полю value присваиваем единицу, если такое слово
уже встречалось, то увеличиваем value: value + 1
Word* insert(Word* node, char * key)
{
if (node == nullptr)
{
node = new Word;
strcpy(node->key, key);
//такое слово
//еще не встречалось, value присваиваем единицу
node->value = 1;
node->left = node->right = nullptr;
return node;
}
int res = strcmp(node->key, key);
//если слово уже встречалось, увеличиваем value: + 1
if(res == 0)
node->value++;
else
{
if (res < 0)
node->left = insert(node->left, key);
else// if (res > 0)
node->right = insert(node->right, key);
}
return node;
}
Теперь мы можем напечатать в неубывающем порядке, с помощью рекурсии, каждое слово и его количество в тексте.
void inorder(Word *node)
{
if (node != nullptr)
{
inorder(node->left);
std::cout << node->key << " " << node->value << "\n";
inorder(node->right);
}
}
Следующая задача, найти минимальное, максимальное слово в тексте:
Дерево словами уже заполнено и упорядочено в лексикографическом порядке. Для поиска минимального слова нужно спуститься от корня влево пока не упрёмся в NULL:
Word * MinWord(Word * node)
{
while (node->left != nullptr)
node = node->left;
return node;
}
Для поиска максимального аналогично, но идем вправо, спускаемся от корня пока не упрёмся в NULL:
Word * MaxWord(Word * node)
{
while (node->right != nullptr)
node = node->right;
return node;
}
Функция main:
int main()
{
Word* root = nullptr;
char text[] = "The first two rotations are single rotations and the next two rotations are double rotations";
char tmp[100];
std::stringstream ss(text);
// разбиваем текст на слова, заполняем дерево
while (ss >> tmp)
root = insert(root, tmp);
// вывод слов и их количества
inorder(root);
// минимальное, максимальное слово:
Word* minWord = MinWord(root);
std::cout << "Min Word: " << minWord->key << std::endl;
Word* maxWord = MaxWord(root);
std::cout << "Max Word: " << maxWord->key << std::endl;
}
Результат:
two 2
the 1
single 1
rotations 4
next 1
first 1
double 1
are 2
and 1
The 1
Min Word: two
Max Word: The
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как создать список экземпляров класса в С++ с помощью list У меня есть класс Bus и Park
У меня есть такой код, он подключается к websocket серверу и отправляет сообщения, но при каждой отправки он создаёт новое подключение на сервере...