Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 21.11.2019
Сообщений: 14

Не работает код бинарного дерева для информационного поля char

21.11.2019, 08:28. Показов 1502. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не работает код бинарного дерева для информационного поля char. Не могу понять в чем ошибка.
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
#include <iostream>
#include "conio.h"
 
struct Binar_Tree //объявление структуры дерева
{
    char data; //информационное поле
    Binar_Tree *left;   //указатель лево
    Binar_Tree *right; //указатель право
};
Binar_Tree *root=NULL; //указателю корня присваиваем значение ноль
int countt=0; //счетчик количества элементов
 
void Add(Binar_Tree **current, char data) //функция добавления элемента
    {
        if (*current!=NULL) //если дерево имеет значение
        {
            if (data<(*current)->data) //если введенное значение меньше
                Add(&(*current)->left, data); //заполняем левую ветвь
            else if (data>(*current)->data) //если введенное значение больше
                Add(&(*current)->right, data); //заполняем правую ветвь
        }
        else //если дерево не имеет значений
        {
            *current=new Binar_Tree; //создаем дерево (выделяем память)
            (*current)->data=data; //корню присваиваем значение введенного
            (*current)->left=NULL; //создаем левую ветвь
            (*current)->right=NULL; //создаем правую ветвь
            countt++; //счетчик увеличиваем на единицу
        }
    }
 
void Changer(Binar_Tree **current, Binar_Tree **tmp) //функция замены
{
    if ((*current)->right!=NULL) //если дерево имеет значение
        Changer(&(*current)->right, &(*tmp)); //рекурсивно вызываем функцию замены
    else
    {
        (*tmp)->data=(*current)->data; //удаляемый узел заменяется крайним правым из левого дочернего узла
        *tmp=*current;
        *current = (*current)->left;
    }
}
 
int Delete(Binar_Tree **current, char data) //функция удаления элемента дерева
{
    int r=0; //переменная для передачи значений, что элемент удален
    if (*current!=NULL) //если дерево имеет значение
    {
        if (data<(*current)->data) //если удаляемый элемент меньше корня
            r=Delete(&(*current)->left, data); // обходим левую ветвь
        else
            if (data>(*current)->data) //если удаляемый элемент больше корня
                r=Delete(&(*current)->right, data); // обходим правую ветвь
            else
            {
                Binar_Tree *tmp=*current; //создание временного указателя
                if (tmp->right==NULL) //если правый лист дерева ноль
                    *current=tmp->left; //удаляем введенный элемент
                else
                    if (tmp->left==NULL) //если левый лист дерева ноль
                        *current = tmp->right; //удаляем введенный элемент
                    else
                        Changer(&(*current)->left, &tmp); //переходим на замену
                delete tmp; //удаляем временный указатель
                countt--; //счетчик уменьшаем на единицу
                r=1; //возвращаемому элементу присваиваем единицу
            }
    }
    return r; //возвращаем значение
}
 
void postorder(Binar_Tree *current) //функция обратного обхода дерева
{
    if (current!=NULL) //если дерево имеет значения
    {
        postorder(current->left); //рекурсивно обходим левую ветвь
        postorder(current->right); //рекурсивно обходим правую ветвь
        printf("%d", current->data); //выводим на консоль
    }
}
 
void Show(Binar_Tree *current, char l) //функция отображения дерева
{
    if (current!=NULL) //если дерево имеет значения
    {
        Show(current->right, l + 1); //рекурсивно обходим правую ветвь
        for (int i=0; i<l; i++) //цикл для построения в виде дерева
            printf("\t"); //при помощи табуляции
        printf("%d \n", current->data); //выводим на консоль
        Show(current->left, l + 1); //рекурсивно обходим левую ветвь
    }
}
 
void Clear(Binar_Tree **current) //функция полной очистки дерева
{
    if (*current!=NULL) //если дерево имеет значения
    {
        Clear(&(*current)->left); //рекурсивно очищаем левую ветвь
        Clear(&(*current)->right);//рекурсивно очищаем правую ветвь
        delete *current; //удаляем элементы
        countt--; //уменьшаем счетчик
        if (countt==0) //если счетчик равен нулю
            *current = NULL; //то корень дерева равен нулю
    }
}
 
int main()
{ 
    char s, num, i, k, j; //объявляем переменные
    char a[] = {1,3,12,2,6,1,3,5,7,10,14,9,11,13,15}; //массив демонстрации дерева
    setlocale(LC_ALL, "rus"); //включение поддержки русского языка
    do //цикл меню
    {
        printf("###### МЕНЮ ###### \n");
        printf("\n");
        printf("1.Добавить элемент \n");
        printf("2.Просмотр дерева \n");
        printf("3.Очистить дерево \n");
        printf("4.Просмотр дерева - обратный обход \n");
        printf("5.Полная генерация дерева \n");
        printf("6.Удаление элемента \n");
        printf("7.Демо - дерево \n");
        printf("0.Выход \n");
        printf("\n");
        printf("Выбранное действие: ");
        scanf_s("%d", &s); //ввод номера из меню
        switch (s) //выбор меню
        {
        case 1:
            printf("\nВведите элемент: ");
            scanf_s("%d", &num); //ввод элемента для добавления
            Add(&root, num); //переходим на функцию добавления
            printf("\nЭлемент добавлен \n\n");
            printf("*********************** \n\n");
            break;
        case 2:
            if (root!=NULL) //если дерево имеет элементы
            {
                printf("\n");
                Show(root, 0); //переходим к функции отображения
            }
            else //если нет, то
                printf("\nДерево пустое \n\n");
            printf("*********************** \n\n");
            break;
        case 3:
            Clear(&root); //переходим на функцию полной очистки
            printf("\nДерево очищено \n\n");
            printf("*********************** \n\n");
            break;
        case 4:
            if (root!=NULL) //если дерево имеет элементы
            {
                printf("\n\n");
                postorder(root); //переходим на функцию обратного обхода
                printf("\n\n"); }
            else
                printf("\nДерево пустое \n\n");
            printf("*********************** \n\n");
            break;
        case 5:
            printf("\nВведите количество элементов: ");
            scanf_s("%d", &k); //вводим количество элементов дерева
            for (i=0; i<k; i++) //цикл случайного заполнения дерева
            {
                num = rand() % 100 + 1;
                Add(&root, num); //переходим на функцию добавления
            }
            printf("\nЭлементы добавлены \n\n");
            printf("*********************** \n\n");
            break;
        case 6:
            if (root!=NULL) //если дерево имеет элементы
            {
                printf("\nУдаляемый элемент: ");
                scanf_s("%d", &num); //вводим элемент для удаления
                if (Delete(&root, num)==1) //переходим на функцию удаления
                { // если единица, то элемент удален
                    printf("\nЭлемент удален \n\n");
                    printf("*********************** \n\n");
                }
                else //а если ноль, то элемент не найден
                { 
                    printf("\nЭлемент не найден \n\n");
                    printf("*********************** \n\n"); }
            }
            else //если дерево не имеет элементы
            { 
                printf("\nДерево пустое \n\n");
                printf("*********************** \n\n"); }
            break;
        case 7:
            printf("\nВведите элемент: ");
            for (j=0; j<15; j=j+1) //цикл заполнения дерева из массива
            { 
                num=a[j];
                Add(&root, num); //переходим на функцию добавления
            }
            printf("\n\nЭлементы добавлены \n\n");
            printf("*********************** \n\n");
            break;
        case 0:
            exit(1); //функция выхода из программы
        default:
            printf("\n\n");
            printf("******************************** \n");
            printf("* Произошла ошибка! * \n");
            printf("******************************** \n\n");
            break;
        }
    }
    while (s!=0); //цикл меню
    _getch(); //функция удержания окна консоли
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.11.2019, 08:28
Ответы с готовыми решениями:

Сформировать двунаправленный список, тип информационного поля char*
Всем привет, кто сможет помочь с заданием? 1. Сформировать двунаправленный список, тип информационного поля char*. 2. Распечатать...

Сформировать односвязный списком с типом информационного поля char*
Нужно сформировать односвязный списком с типом информационного поля char* С типом int программа работает нормально, с типом char*...

Нужно создать двунаправленный список. Тип информационного поля char
Нужно добавить в список элементы с номерами 1,3,5... ______________ Даже не могу представить создание списка char..помогите ,пожалуйста

20
43 / 39 / 5
Регистрация: 16.09.2019
Сообщений: 285
21.11.2019, 12:12
Студворк — интернет-сервис помощи студентам
Алексей1153, смотря для кого, для программы - абсолютно ничего (в этом конкретном случае), а для понимания, особенно учащимся, много.
Никто же не запрещает использовать вообще везде указатели, в смысле все переменные так объявлять, просто это глупо и читать потом сложно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.11.2019, 12:12

В рабочей программе добавить для дерева бинарного поиска нахождение отрицательных значений узлов дерева
Полностью готовая программа, но что дописать в мейне чтобы он выводил произведение отрицательных узлов???:-| using System; using...

Для каждого бинарного дерева выполнить преобразование дерева в список, результат вывести в виде списка списков
Объясните почему не работает, задание было таким &quot; Дан список, элементы которого — непустые бинарные деревья с числами в качестве...

Исправить код бинарного дерева
#include &lt;stdlib.h&gt; #include &lt;iostream&gt; struct uzel { int key;//хранится в вершине ключ-значение struct uzel...

Код Хаффмана реализованный через построение бинарного дерева
Здравствуйте, есть код Хаффмана реализованный через построение бинарного дерева, узлами которого является элемент типа map ,либо символ и...

переводчик поиском бинарного дерева не работает программа!
Программа содержит ошибки помогите убрать #include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;locale&gt; using namespace std; class...


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru