Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
2 / 1 / 1
Регистрация: 15.06.2018
Сообщений: 8

Реализация префиксного дерева списками

15.05.2020, 22:56. Показов 4722. Ответов 1

Студворк — интернет-сервис помощи студентам
Построить префиксное. Использовать реализацию общего дерева в виде бинарного дерева. Проверить с помощью этого леса, есть ли среди указанных чисел число N, введённое с клавиатуры.
То бишь сыновья узла должны образовывать связный список (не нашёл на форуме ничего подобного). В этом случае каждый узел будет содержать только по два указателя - на первый элемент в списке сыновей, и на брата.
Для лучшего понимания задачи прикрепляю изображение дерева с ключами: 112, 11, 1789, 38, 371. (только на рисунке признаком конца ключа является число -1, а у меня в коде им является символ 'N'.

Вот линейный список, который я реализовал для решения этой задачи (с ним проблем нет)
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
73
#include <iostream>
 
using namespace std;
 
struct node
{
    char field; /*ключ*/
    node *son, *brother; /*указатели на сына и брата*/
 
    node() /*изначально ставим указатели на NULL*/
    {
        son = NULL;
        brother = NULL;
        field = 'N'; /*признак конца ключа*/
    }
};
 
class List
{
 
public:
 
    node *head; /*голова списка*/
 
    List()
    {
        head = NULL;
    }
 
    ~List() /*удаление списка узлов*/
    {
        node * temp;
        while (head) /*пока список не пуст*/
        {
            temp = head; /*сохраняем адрес головы в temp*/
            head = head->brother; /*переходим на следующий элемент списка*/
            delete temp; /*удаляем бывшую голову*/
        }
    }
 
    void add ( char d ) /*добавление в начало списка*/
    {
        node *nd = new node; /*выделяем память под новый элемент*/
 
        nd->field = d; /*записываем в поле нового элемента значение, которое нужно добавить*/
        if (head == NULL) /*если список пуст*/
            head = nd; /*то создаём голову*/
        else
        {
            nd->brother = head; /*пусть указатель в добавляемом элементе указывает на голову*/
            head = nd; /*перемещаем указатель на голову на добавленный элемент*/
        }
    }
 
    void show() /*печать списка*/
    {
        node *current = head; /*создаём указатель на голову*/
 
        while(current != NULL) /*пока список не пуст*/
        {
            cout << current->field << " "; /*выводим содеримое узла*/
            current = current->brother; /*переходим к следующему элементу*/
        }
    }
 
    node* find_node (char c) /*поиск элемента со значением c*/
    {
         node *cur = head; /*создаём указатель на голову*/
         while (cur && cur->field != c) /*пока в списке есть элементы и они не равны c*/
               cur = cur->brother; /*переставляем указатель на следующий элемент*/
         return cur; /*возвращаем или NULL, или указатель на элемент, имеющий искомое значение поля*/
    }
};
А вот ниже то, что вызвало у меня серьёзнейшие проблемы. Ни как не удаётся написать функцию добавления узла в дерево. Буду благодарен за помощь в её написании.
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
73
74
75
76
77
78
79
80
#include <iostream>
#include <cstdlib>
#include "list.h"
 
using namespace std;
 
class tree
{
 
public:
 
    tree(){};
 
    ~tree(){};
 
    List *root = new List;     /*корень дерева*/
 
    void add(const string& s) /*добавляет в дерево число, представленное в виде массива символов*/
    {
        List *cur_list;     /*создаём пустой список*/
        cur_list = root; /*делаем созданный список копией корня и начингаем работать с ним, чтобы не потерять указатель на корень дерева*/
        for (int i = 0; i < s.length(); i++)
        {
            char c = s[i];
            node *p; /*создаём указатель на узел*/
            p = cur_list->find_node(c); /*присваиваем ему адрес узла, содержащего цифру c или NULL*/
            if (p) /*если эта цифра есть в списке*/
            {
                cur_list->head = p; /*переходим на сына того узла, в котором нашлась эта цифра*/
            }
            else /*в коде ниже моя голова стала вскипать*/
            {
                cur_list->add('N');
                i++;
                for (int j=i; j<s.length(); j++,i++)
                {
                    cur_list->head->field = c;
                    p = cur_list->find_node(c);
                    List *new_list = new List;
                    new_list->add('N');
                    p->son = new_list->head;
                    cur_list = new_list;
                    c = s[j];
                }
                cur_list->add('N');
            }
        }
    }
 
    void print_tree (node* r)
    {
        if (r==NULL) return;
        if (r->brother)
        {
            print_tree(r->brother);
        }
        cout << r->field << " ";
        if (r->field == 'N')
            cout << endl;
        if (r->son)
        {
            print_tree (r->son);
        }
    }
};
 
int main()
{
    system("chcp 1251");
    system("cls");
    tree mytree;
    mytree.add("112N");
    mytree.add("11N");
    mytree.add("1789N");
    mytree.add("38N");
    mytree.add("371N");
    cout << "Вывод содержимого дерева: " << endl;
    mytree.print_tree(mytree.root->head);
    return 0;
}
Миниатюры
Реализация префиксного дерева списками  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.05.2020, 22:56
Ответы с готовыми решениями:

Реализация 2-3 дерева
Помогите пожалуйста реализовать 2-3 дерево

Реализация дерева на указателях
Задание такое:Пусть А, В,С – деревья соответствующего типа, узлы которых могут содержать целочисленные значения. Требуется реализовать...

Реализация бинарного дерева
Доброго времени суток, уважаемые форумчане. Возник вопрос по реализации бинарного дерева на С++, а именно с методом удаления элемента в...

1
2 / 1 / 1
Регистрация: 15.06.2018
Сообщений: 8
17.05.2020, 14:12  [ТС]
Забыл уточнить, что никаких требований к решению, кроме тех, которые были описаны в начале темы, нет. Если что-то в моём коде вам не нравится, то это может быть изменено/удалено. К примеру, если вам кажется неудачным какой-либо метод в реализации моего списка, то он может быть заменён.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.05.2020, 14:12
Помогаю со студенческими работами здесь

Реализация бинарного дерева
написать программу, реализующую бинарное дерево. Предусмотреть процедуры и функции: инициализация дерева, вставка элемента (вершины),...

Реализация дерева поиска
Мне крайне срочно необходимо реализовать дерево поиска на с++(чтобы пользователь сам вводил значения), я и сам конечно пытался сделать это,...

Реализация бинарного дерева поиска
Задача: Реализация бинарного дерева поиска Компилируется нормально, а при запуске выбивает ошибку : &quot;Необработанное исключение по...

Реализация бинарного дерева поиска
Не выводит значения узлов деревьев, как я понял происходит утечка памяти, но я не пойму, что нужно сделать. Программа ошибку не выдаёт....

Реализация красно-черного дерева
Нужна помощь с красно-черным деревом;) Как свести эти части кода в одно целое, нужно чтобы после ввода каждого нового элемента, выводился...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru