0 / 0 / 0
Регистрация: 08.01.2013
Сообщений: 15
1

Алгоритм удаления узла из бинарного дерева

05.03.2015, 20:21. Показов 2158. Ответов 3
Метки нет (Все метки)

Есть алгоритм удаления узла из бинарного дерева поиска,в нем ,если узел имеет 2 х сыновей используется функция DeleteMin.Все работает ,но когда я пытался впихнуть эту функцию в процедуру ,то сразу удаление перестает нормально работать.Помогите переделать её.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function DeleteMin(var Root: TTree): T;
var WasRoot: TTree;
begin
 
    if Root^.Left = nil then begin
        DeleteMin := Root^.value;   { Результат функции }
        WasRoot := Root;        { Запоминаем узел для последующего удаления }
        Root := Root^.Right;        { продвигаемся дальше }
        Dispose(WasRoot);       { удаляем бывший корень }
    end
    else { узел Root имеет левого "сына" }
        DeleteMin := DeleteMin(Root^.Left);
    
end;
Pascal
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
procedure Remove(var Root: TTree; X: T);
var WasNext: TTree;
begin
    if Root <> nil then
        if X < Root^.value then Remove(Root^.Left, X)
        else 
            if X > Root^.value then Remove(Root^.Right, X)
            else 
                if (Root^.Left = nil) and (Root^.Right = nil) then begin
                    { Нет "сыновей", удаляем узел, на который указывает Root }
                    Dispose(Root); 
                    Root := nil
                end
                else 
                    if Root^.Left = nil then begin
                        WasNext := Root^.Right;
                        Dispose(Root);
                        Root := WasNext;
                    end
                    else
                        if Root^.Right = nil then begin
                            WasNext := Root^.Left;
                            Dispose(Root);
                            Root := WasNext;
                        end
                        else { у удаляемого элемента есть оба "сына" }
                            Root^.value := DeleteMin(Root^.Right);
end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.03.2015, 20:21
Ответы с готовыми решениями:

Удаления узла из бинарного дерева поиска
Уже довольно много времени убил на эту задачу, теорию понимаю, на практике реализовать никак не...

Удаление узла бинарного дерева
Бьюсь над задачей битый час, в функцию передаю указатель на узел, который и хотим удалить. И в...

Удаление узла бинарного дерева
всем привет.вот есть у меня бинарное дерево тока фун-ии добавления и обхода.очень нужно удалени...

Удаление узла из бинарного дерева
всем доброго времени суток. помогите пожалуйста с удалением элемента из дерево, а именно с...

3
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32488 / 20974 / 8115
Регистрация: 22.10.2011
Сообщений: 36,245
Записей в блоге: 7
05.03.2015, 20:25 2
Цитата Сообщение от Олежко Посмотреть сообщение
но когда я пытался впихнуть эту функцию в процедуру
Как именно пытался, что она не работает?
0
0 / 0 / 0
Регистрация: 08.01.2013
Сообщений: 15
05.03.2015, 20:49  [ТС] 3
делал так:нашел самый левый элемент правого поддерева (пусть rab)
Pascal
1
2
3
4
5
else
wasroot:=rab;
tree^.inf:=rab^.inf
rab:=rab^.r
dispose(wasroot);
сделал так и после вывода на экран сначала выводит дерево а после него непонятные цифры

Добавлено через 7 минут
или пишет "необработанное исключение...."
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32488 / 20974 / 8115
Регистрация: 22.10.2011
Сообщений: 36,245
Записей в блоге: 7
05.03.2015, 20:53 4
Не, я восстанавливать по обрывкам "делал вот как-то так" код не буду. Почему-то мой код ты привел полностью, а вот свой - не хочешь, чтобы можно было взять, запустить, и проверить. Ну, нет - так нет...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2015, 20:53
Помогаю со студенческими работами здесь

Удаление узла из бинарного дерева
всем доброго времени суток! имеется бинарное дерево, которое хранит в себе элементы с данными в...

Удаление Узла бинарного дерева
Добрый вечер. Имеем Бинарное дерево поиска. При удалении некоторого узла . возникают три...

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

Удаление узла и корня бинарного дерева
struct Tree { int value; Tree *l, *r; }; void add(Tree *&amp;obj, int value) { if (obj ==...


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

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

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