Бинарное дерево поиска: структуры

215
06 мая 2018, 20:24

Вот задание:
1) преобразование структур в дерево поиска;
Что такое дерево поиска, я понял, но подскажите,пожалуйста, как это реализовать, желательно с каким-нибудь примером.

Answer 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

READ ALSO
добавление экземпляров класса в list С++

добавление экземпляров класса в list С++

Как создать список экземпляров класса в С++ с помощью list У меня есть класс Bus и Park

194
boost::asio websocket С++

boost::asio websocket С++

У меня есть такой код, он подключается к websocket серверу и отправляет сообщения, но при каждой отправки он создаёт новое подключение на сервере...

195
Не коннектится слот Qt5

Не коннектится слот Qt5

Задача с вероятно очень глупой ошибкой перенесенная на тестовый проект:

189