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

Ошибка при добавлении элемента в бинарное дерево поиска

20.06.2015, 17:34. Показов 662. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программа формирует бинарное дерево из отсортированного массива и добавляет в него элементы.

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
struct Tree
{
    Tree *left_son, *right_son;
    int head, key/*, depth*/;
};
 
Tree *tree(int *a, int left, int right)
{
    Tree *tree1 = new Tree;                                         // выделяем динамическую память
    int mid = middle(left,right);                                       // находим центральный элемент
    tree1->head = a[mid];                                           // записывает центрольный элемент в корень
    if (left != mid) 
    {
        tree1->left_son = tree(a, left, mid-1);         // рекурсивно вызываем функцию для левой ветки
    }
    if (right != mid) 
    {
        tree1->right_son = tree(a, mid+1, right);       // рекурсивно вызываем функцию для правой ветки
    }
    return tree1;
}
 
Tree *add(Tree *tree1, int key)
{
    Tree *temp_tree = new Tree; //создаем дерево
    temp_tree->head = key; //записываем в его корень добавляемый элемент
    Tree *curr_pos = tree1; //создаем дерево для прогонки, равное исходному дереву
    do
    {
        if (curr_pos->left_son != 0 && curr_pos->right_son !=0) //если элемент не лист
        {
            if(temp_tree->head < curr_pos->head)                                    // если элемент меньше проверяемого
            {
                if(curr_pos->left_son != 0)                                     // если слева не пусто
                    curr_pos = curr_pos->left_son;                                      // переходим к левой ветке
                else
                {                                                       // если слева пусто
                    curr_pos->left_son = temp_tree;                                 // записываем значение
                    curr_pos->left_son->left_son = 0;                                   // обнуляем поддеревья
                    curr_pos->left_son->right_son = 0;                                  // обнуляем поддеревья
                    break;                                              // конец добавления
                }
            }
            else                                                        // если элемент больше проверяемого
            {
                if(curr_pos->right_son != 0)                                        // если справа не пусто
                    curr_pos = curr_pos->right_son;                                     // переходим к правой ветке
                else                                                     
                {                                                       // если справа пусто
                    curr_pos->right_son = temp_tree;                                    // записываем значение
                    curr_pos->right_son->left_son = 0;                                  // обнуляем поддеревья
                    curr_pos->right_son->right_son = 0;                                 // обнуляем поддеревья
                    break;                                              // конец добавления
                }
            }
        }
        else
        {
 
        }
    } while (/*curr_pos->left_son != 0 && curr_pos->right_son !=0*/!0);
    return tree1;
}
Ошибка происходит при добавлении, на определенном шаге условие
C++
1
if(curr_pos->left_son != 0)
срабатывает неверно, и программа переходит к следующему узлу, которого нет. Иными словами, она "видит" левого потомка у узла, а этого происходить не должно. Подобной темы не нашел. Заранее благодарю

Добавлено через 1 час 11 минут
PS. Переделал функцию добавления, используя рекурсию.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void add (Tree * curr_pos, int key)
{
    if (key < curr_pos->head) 
    {
        if (curr_pos->left_son != nullptr)
            add (curr_pos->left_son, key);
        else 
        {
            Tree * tmp_tree = new Tree;
            curr_pos->left_son = tmp_tree;
        }
    }
    else
    {
        if (curr_pos->right_son != nullptr)
            add (curr_pos->right_son, key);
        else 
        {
            Tree * tmp_tree = new Tree;
            curr_pos->right_son = tmp_tree;
        }
    }
}
Проблема сохранилась - на моменте
C++
1
if (curr_pos->left_son != nullptr)
программа думает, что у узла есть левый потомок, хотя там, на самом деле, его нет (делал трассировку, у проблемного узла левый потомок равен "???", разве это не соответствует ключевому слову "nullptr"?)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.06.2015, 17:34
Ответы с готовыми решениями:

Исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру
Помогите, не могу понять!( Нужно исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру. вот...

Бинарное дерево поиска (удаление, добавление элемента)
Задачи В Бинарном дереве поиска 1)введено с клавиатуры значение, если существует узел с таким значением, он удаляется; 2) с...

Добавление нового элемента в бинарное дерево поиска с вспомогательной функцией(без рекурсии)
с реализацией этой функции с рекурсией проблем нету.но без нее уже по-сложнее(.есть функция иbool Add(int) определенная в классе Дерева,и в...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.06.2015, 17:34
Помогаю со студенческими работами здесь

Преобразовать идеальное бинарное дерево в бинарное дерево поиска
Всем привет, я создал идельное бинарное дерево и написал к нему функции. Как мне теперь можно преобразовать его в бинарное дерево поиска?...

Данные из массива структур Date передать в бинарное дерево поиска и вывести его при помощи обратного обхода
Доброго времени суток! Задание:Данные из массива структур Date передать в бинарное дерево поиска и вывести его при помощи обратного...

Бинарное дерево: как происходит добавления элемента в дерево с двумя параметрами
Здравствуйте! Прошу помощи у опытных программистов...)))) Есть класс дерево: class class1 { public class Tree ...

Бинарное дерево поиска
Я написала программу поиска минимума в массиве или среди элементов массива от i до j. В части запросов программа работает правильно, но...

Бинарное дерево поиска
Давайте рассмотрим некоторый пример Допустим есть числа от 0 до 99 которые добавляются в бинарное дерево Элементы в бинарное дерево...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru