Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для crazykreis
37 / 21 / 17
Регистрация: 13.04.2016
Сообщений: 106

Как равномерно распределить по дереву дублированные элементы?

05.04.2023, 09:36. Показов 579. Ответов 2

Студворк — интернет-сервис помощи студентам
Задача вот в чём, нужно добавить в дерево слова (слова считываются из файла) и распределить их в алфавитном порядке. И посчитать сколько раз встречается каждое слово. С тем чтобы распределить разные слова проблемы нет: в случае если слово должно быть слева (предшествует корневому элементу) и левый узел пустой я добавляю слово, если узел не пустой то уже левый сравниваю с добавляемым элементом рекурсивно. То же самое для правой ветви (если элемент следует за корневым). Функции сравнения в коде "ToLeft" и "ToRight". А вот как быть в случае, если встретился дубликат? У меня были следующие мысли: первый вопрос в какое поддерево добавлять дубликат? Левое или правое? Здесь я решил, чтобы дубликаты распределялись равномерно создать статическую переменную и инкрементировать ее по мере добавления новых слов. Если переменная чётная дубликат пойдёт в левое поддерево, если нет в правое. Также я инкрементирую количество элементов в корневом дереве и присваиваю это значение новому дубликату (получится что каждый дубликат помещенный в дерево показывает сколько всего таких дубликатов есть в дереве). Второй вопрос: что если добавляется дубликат, а левый и правый узлы уже заняты? Тогда я правому поддерву нвого узла присваю правый узел, а правый узел делаю новым узлом. То же самое для левого? Но здесь вот какая штука получается. Пусть при первом появлении дубликата я инкрементировал количество элементов в корневом узле и это значение присвоил новому узлу. Но что если дубликат встретился вновь? Тогда я снова инкреметирую корневой узел и новый, но предыдущий дубликат остался бы тогда с прежним значением. В этом случае поможет рекурсивно двигаться по узлам пока не встретится первый отличающийся элемент? Вообщем я сам уже начинаю слегка путаться в мыслях, но надеюсь вы меня поняли. Вот сам код функции в ней проблема именно в куске где добавляется дубликат. ("Ошибка сегментирования: стек памяти сброшен на диск").

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
static void AddNode(Trnode *new_node, Trnode *root)
{
        
           
    if(ToLeft(&new_node->item,&root->item))
    {
 
        if(root->left == NULL)
        {
            root->left = new_node;
            root->left->item.count++;
        }
                        
        else
            AddNode(new_node,root->left);
    }
 
    else if(ToRight(&new_node->item,&root->item))
    {
 
        if(root->right == NULL)
        {
            root->right = new_node;
            root->right->item.count++;
        }
            
        else
            AddNode(new_node,root->right);
    }
 
    else
    {
        root->item.count++;
        new_node->item.count = root->item.count;
 
        if(root->left = NULL)
               root->left = new_node;
            else if(root->right == NULL)        
               root->right = new_node;
        else
        {
            static int x = 1;
            printf("%d ",x);
            if(x % 2 == 0)
            {
                if(strcmp(new_node->item.word,root->left->item.word) != 0)
                {
                    new_node->left = root->left;
                    root->left = new_node;
                }
 
                else
                    AddNode(new_node,root->left);
 
            }
 
            else
            {
                if(strcmp(new_node->item.word,root->right->item.word) != 0)
                {
                    new_node->right = root->right;
                    root->right = new_node;
                }
 
                else
                    AddNode(new_node,root->right);
            }
          x++;  
        }
                
        }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.04.2023, 09:36
Ответы с готовыми решениями:

Как равномерно распределить элементы по StackPanel?
Если добавить элемент в StackPanel, то его VerticalAlignment ни на что не влияет - всё равно элементы приклеиваются к верхней грани...

Равномерно распределить элементы по ширине
Пытаюсь расположить 2 кнопки в ряд так, что бы они занимали ровно по половине экрана по ширине. Изначально все вроде шло хорошо, но на...

Как равномерно распределить по ячейкам?
Помогите пожалуйста советом. У меня есть объём работ (пробурить 219 скважин) и срок 12 дней. Предварительно необходимо составить...

2
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
05.04.2023, 17:18
Лучший ответ Сообщение было отмечено crazykreis как решение

Решение

Цитата Сообщение от crazykreis Посмотреть сообщение
И посчитать сколько раз встречается каждое слово.
Ну так и заведите в узлах счётчики. Если слово встречается впервые, создаётся новый узел, в котором полю со счётчиком присваивается 1. Если узел со словом уже есть, просто увеличиваете на 1 его поле счётчика.
1
 Аватар для crazykreis
37 / 21 / 17
Регистрация: 13.04.2016
Сообщений: 106
05.04.2023, 20:30  [ТС]
easybudda,
Цитата Сообщение от easybudda Посмотреть сообщение
Ну так и заведите в узлах счётчики.
Да так и нужно было сделать по заданию. Просто я пытался зачем то и дубликаты добавлять в дерево, а потом ломал голову еще над тем как отобразить 1 оригинальный элемент и не отобразить остальные. А после вашего сообщения подумал: действительно зачем добавлять дубликаты в дерево если можно просто инкрементировать оригинал. Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.04.2023, 20:30
Помогаю со студенческими работами здесь

Как равномерно распределить LI по горизонтали
Привет всем. Имеется следующий код: <nav> <ul> <li>Link 1</li> <li>Link 2</li> <li>Link 3</li> ...

Как равномерно распределить задания между процессорами?
Поиск простых чисел в диапазоне start_num ... end_num void PrimeSearch( int start_num, int end_num); int main(int argc, char...

Равномерно распределить данные в массиве
Добрый день. Помогите решить задачку. Есть на входе массив скажет из 20 элементов(реально может быть за тысячу).После наложения фильтра...

Равномерно распределить монеты в N мешков
Человек вбивает в программу число(N) мешков, и количество монет в каждом из них. Нужно написать программу, которая разобьет все монеты в...

Распределить пункты меню равномерно
Помогите плз распределить пункты меню равномерно по блоку меню. (а заодно и убрать зазорчик между шапкой и меню ;) ) Вот накидал что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru