3 / 3 / 3
Регистрация: 03.11.2014
Сообщений: 80
1

Бинарное дерево: удаление элементов

25.05.2015, 03:04. Показов 1473. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста реализовать удаление элементов бинарного дерево, добавление и вывод вроде сделал, а тут путаюсь
Бинарное дерево реализовано так, что у каждого элемента 2 потомка, левый меньше либо равен предку, а правый больше
Тяжело просто сдвигать элементы вверх, если например удаляется предок, и при этом нужно его правый потомок поставить на место этого предка. в общем вот код, если нужно, помогите пожалуйста с удалением)
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
# include <iostream>
using namespace std;
struct node{
    int info; //Информационное поле
    node *l, *r;//Левая и Правая часть дерева
};
void push(int a, node **t){
    if ((*t) == NULL) //Если дерева не существует
    {
        (*t) = new node; //Выделяем память
        (*t)->info = a; //Кладем в выделенное место аргумент a
        (*t)->l = (*t)->r = NULL; // его левый и правый потомки присваиваем 0
        return;
    }
    //Дерево есть
    if (a>(*t)->info) push(a, &(*t)->r); //Если аргумент а больше чем текущий элемент, кладем его вправо
    else push(a, &(*t)->l); //Иначе кладем его влево
}
void print(node *t, int u){
    if (t == NULL) return; //Если дерево пустое, то отображать нечего, выходим
    else //Иначе
    {
        print(t->l, ++u);//С помощью рекурсивного посещаем левое поддерево
        for (int i = 0; i<u; ++i) cout << "|"; // "выбираем крайний элемент и считаем сколько до него узлов"
        cout << t->info << endl; //И показываем элемент
        u--;
    }
    print(t->r, ++u); //С помощью рекурсии посещаем правое поддерево
}
int main(){
    setlocale(0, "RUS");
    node * tree = NULL; //Объявляем переменную, тип которой структура Дерево
    char count;
    int n,s;
    do
    {
        cout << "1. Добавить элемент в дерево\n";
        cout << "2. Вывести дерево\n";
        cout << "0. Выйти\n";
        cin >> count;
        switch (count)
        {
        case '1':
            cout << "введите количество элементов  ";
            cin >> n; //Вводим количество элементов
 
            for (int i = 0; i<n; ++i)
            {
                cout << "ведите число  ";
                cin >> s; //Считываем элемент за элементом
 
                push(s, &tree); //И каждый кладем в дерево
            }
            break;
        case '2':
            print(tree, 0);
            break;
        case '3': break;
        default: cout << "Неверное значение, введите заново\n";
            break;
        }
    } while (count != '0');
    system("Pause");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.05.2015, 03:04
Ответы с готовыми решениями:

Бинарное дерево. Поиск, вывод и удаление элементов из дерева
Задача следующая: Разработать программу, которая содержит информацию о реестре жилых помещений...

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

Бинарное дерево, удаление элемента
Задание: создать класс для хранения целых чисел в виде бинарного дерева. Обеспечить поиск,...

Бинарное дерево. Удаление звена
Помогите реализовать функцию удаления звена дерева Del (все потомки и само звено нужно удалить)....

2
120 / 34 / 19
Регистрация: 19.03.2015
Сообщений: 90
25.05.2015, 08:46 2
Оформите код читабельным образом, так Вам быстрее помогут.

Добавлено через 2 часа 24 минуты
Можно использовать рекурсивную функцию для удаления элементов.
Мы не можем просто присвоить NULL отцу так как навсегда потеряем доступ к памяти выделенной под потомков.
Алгоритм прост:
Удаляя элемент мы идем сначала например налево, смотрим если там не NULL, значит снова идем налево, если там NULL то идем на право, если там тоже NULL то удаляем, так как мы успешно проверили потомка на потомков то удаляем его и по рекурсии поднимаемся обратно наверх, где мы первый раз пошли налево и идем на право, если там не NULL то повторяем алгоритм для правого, если NULL то смело удаляем. Таким образом мы освободим всю выделенную память под отца и потомков успешно удалив элемент.
Так же рекомендую хранить в структуре данные об отце, заметно облегчит задачу.
И еще
Кликните здесь для просмотра всего текста
Написав new сразу пишите delete
0
3 / 3 / 3
Регистрация: 03.11.2014
Сообщений: 80
26.05.2015, 13:44  [ТС] 3
Пытаюсь удалить хотя бы лист, просто чтобы он его больше не выводил, но выдает ошибку, помогите разобраться
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
# include <iostream>
 
using namespace std;
 
 
struct node
{
    int info; //Информационное поле
    node *l, *r;//Левая и Правая часть дерева
};
 
 
 
 
void push(int a, node **t)
{
    if ((*t) == NULL) //Если дерева не существует
    {
        (*t) = new node; //Выделяем память
        (*t)->info = a; //Кладем в выделенное место аргумент a
        (*t)->l = (*t)->r = NULL; // его левый и правый потомки присваиваем 0
        return;
    }
    //Дерево есть
    if (a>(*t)->info) push(a, &(*t)->r); //Если аргумент а больше чем текущий элемент, кладем его вправо
    else push(a, &(*t)->l); //Иначе кладем его влево
}
 
 
void print(node *t, int u)
{
    if (t == NULL) return; //Если дерево пустое, то отображать нечего, выходим
    else //Иначе
    {
        print(t->l, ++u);//С помощью рекурсивного посещаем левое поддерево
        for (int i = 0; i<u; ++i) cout << "|"; // "выбираем крайний элемент и считаем сколько до него узлов"
        cout << t->info << endl; //И показываем элемент
        u--;
    }
    print(t->r, ++u); //С помощью рекурсии посещаем правое поддерево
}
 
void find(node *t, int key)
{
    if (t == NULL) cout << "Элемент не найден\n";
    else {
        if (t->info == key) cout << "Элемент найден  " << key << "\n";
        else if (t->info > key) find(t->l, key);
        else if (t->info < key) find(t->r, key);
    }
}
 
void del(node *t, int key)
{
    if (t == NULL) return;
    if (t->info == key)
        delete t;
    else if (t->info > key)
        del(t->l, key);
    else if (t->info < key)
        del(t->r, key);
}
 
int main()
{
    setlocale(0, "RUS");
    node * tree = NULL; //Объявляем переменную, тип которой структура Дерево
    char count;
    int n,s;
    do
    {
        cout << "1. Добавить элемент в дерево\n";
        cout << "2. Вывести дерево\n";
        cout << "3. Найти элемент\n";
        cout << "0. Выйти\n";
        cin >> count;
        switch (count)
        {
        case '1':
            cout << "введите количество элементов  ";
            cin >> n;
 
            for (int i = 0; i<n; ++i)
            {
                cout << "ведите число  ";
                cin >> s;
 
                push(s, &tree);
            }
            break;
        case '2':
            print(tree, 0);
            break;
        case '3':
            cout << "Введите элемент, который хотите найти\n";
            int whattofind;
            cin >> whattofind;
            find(tree, whattofind);
            break;
        case '4':
            int whattodel;
            cin >> whattodel;
            del(tree, whattodel);
            break;
        case '0': break;
        default: cout << "Неверное значение, введите заново\n";
            break;
        }
    } while (count != '0');
    system("Pause");
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.05.2015, 13:44
Помогаю со студенческими работами здесь

Бинарное дерево из слов и удаление узла
Ребят нужно создать дерево где пользователь вводит слова, они записываются в дерево, а потом вводит...

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

Бинарное дерево, удаление звеньев числом меньше заданного
Народ, все привет. У меня стоит некая условная задача: В некоторой файловой системе справочник...

Добавление элементов бинарное дерево
Всем добрый день, не выручит кто нибудь алгоритмом который заполняет двоичное дерево поиска

Бинарное дерево поиска (Количество элементов)
Здравствуйте все. Помогите пожалуйста разобраться с 2 ошибками. 1) Иногда добавляются числа не в...

Перемещение элементов массива на бинарное дерево
Добрый день. Помогите пожалуйста, стоит задача сформировать минимальное пирамидальное дерево для...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru