Помощь - Поиск - Пользователи - Календарь
Полная версия: Бинарное дерево (который раз)
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
onizuka1988
Здравствуйте, искал уже подобную задачу, нашёл модуль для работы с ней, но там нету одной процедуры.
Вот сама задача:
Разработайте программу работы с бинарным деревом. Программа должна содержать следующие процедуры, вызывае-мые из меню:
- построение пустого дерева;
- добавление нового элемента;
- удаление указанного поддерева;
- просмотр дерева в следующем порядке: левая ветвь, узел, правая ветвь.
А вот там процедура которой у меня нету - удаление указанного поддерева
Буду очень благодарен, если кто нибуть поможеш с данной программой (желательно целиком, но если нет - то можно и процедуру).
volvo
Цитата(onizuka1988 @ 22.12.2006 11:18)
А вот там процедура которой у меня нету - удаление указанного поддерева
Погоди...

Есть же процедура "удаление дерева"? Так вот, если ее вызвать, вместо корня дерева передав ей узел, который (вместе со всеми его потомками) надо удалить - то это будет сделано...
onizuka1988
Цитата(volvo @ 22.12.2006 12:32) *

Погоди...

Есть же процедура "удаление дерева"? Так вот, если ее вызвать, вместо корня дерева передав ей узел, который (вместе со всеми его потомками) надо удалить - то это будет сделано...


Хм, для своей программы я использовал данную заготовку, где с помошью меню реализованы 11 функций для работы с бинарным деревом. Процедуру удаления дерева мне не удалось переделать. Не могли бы ли Вы мне в этом помоч? Буду очень благодарен.
volvo
Тогда показывай код инициализации и заполнения дерева, и код поиска ПОДдерева, которое надо будет удалить - я напишу, КАК его удалить...
onizuka1988
Вот Процедура удаления самого элемента:

procedure delelem(var root:PTree;info:byte);
var temp:PTree;
begin
if (root<>NIL) then (* Если дерево не пустое, то *)
begin
if (info<root^.info) then (* Если удаляемый элемент меньше тек. узла, то *)
delelem(root^.left,info) (* Удалить его из левого поддерева *)
else (* Иначе *)
if (info>root^.info) then (* Если удаляемый элемент больше тек. узла, то *)
delelem(root^.right,info) (* Удалить его из правого поддерева *)
else (* Иначе тек. узел - удаляемый элемент *)
begin
if (root^.left=NIL) and (root^.right=NIL) then
begin (* Если тек. узел - лист, то *)
(* Удалить его *)
dispose(root);
(* Поставить на его место пустое дерево *)
root:=NIL;
end
else

if (root^.left=NIL) and (root^.right<>NIL) then
begin (* Если у тек.узла есть только правая ветвь *)
(* Присоединить её вместо тек. узла *)
temp:=root;
root:=root^.right;
(* Удалить тек. узел *)
dispose(temp);
end
else
if (root^.left<>NIL) and (root^.right=NIL) then
begin (* Если у тек.узла есть только левая ветвь *)
(* Присоединить её вместо тек. узла *)
temp:=root;
root:=root^.left;
(* Удалить тек. узел *)
dispose(temp);
end
else (* Иначе у узла есть обе ветви *)
begin
(* Вставить на место узла самый правый эл-т левого поддерева *)
root^.info:=getmostright(root^.left);
(* Удалить самый правый эл-т из левого поддерева *)
delelem(root^.left,root^.info);
end;

end;
end;
end;


Непомню, где то сдесь на форуме брал это из программы, где есть все функции для работы с бинарным деревом.
А вот процедура из Вашего модуля:

Procedure Delete(T: TTree);
Begin
If T = nil Then Exit;

Delete(T^.Right);
Delete(T^.Left);
Dispose(T)
End;


Так вот, как я понимаю, если одинаковых элементов в дереве не будет, то соответственно не обязательно нужна процедура поиска поддерева. Нужно переделать Вашу процедуру, просто указываеться элеменет, который нужно удалить, после чего удаляется заданный элемент и все его ветвления вправо и влево.
Если сможете, помогите дописать.
volvo
А теперь подними глаза и перечитай мой пост выше... Ты сделал с точностью "до наоборот" - то, что я НЕ просил - ты привел, а то, что я ПРОСИЛ - нет... Вот и я сделаю точно так же - я не буду ничего отвечать, пока ты не научишься ЧИТАТЬ ответы... Я ж не просто так прошу тебя привести ТВОЙ вариант, неужели же не ясно??? Я все сделаю правильно (создание дерева, поиск поддерева), удалю как положено - приведу тебе функцию, ты скажешь "НЕ работает"... Мне это надо? Не надо... Вот и приведи СВОЕ заполнение/поиск поддерева (не надо всю программу, меня твой интерфейс НЕ ИНТЕРЕСУЕТ, я не могу читать программы с тем интерфейсом, который вы на него навешиваете - суть алгоритма теряется) - ТОЛЬКО заполнение дерева данными (причем сами данные - тоже), и поиск, ЧЕГО будем удалять...
onizuka1988
Цитата(volvo @ 24.12.2006 17:55) *

А теперь подними глаза и перечитай мой пост выше... Ты сделал с точностью "до наоборот" - то, что я НЕ просил - ты привел, а то, что я ПРОСИЛ - нет... Вот и я сделаю точно так же - я не буду ничего отвечать, пока ты не научишься ЧИТАТЬ ответы... Я ж не просто так прошу тебя привести ТВОЙ вариант, неужели же не ясно??? Я все сделаю правильно (создание дерева, поиск поддерева), удалю как положено - приведу тебе функцию, ты скажешь "НЕ работает"... Мне это надо? Не надо... Вот и приведи СВОЕ заполнение/поиск поддерева (не надо всю программу, меня твой интерфейс НЕ ИНТЕРЕСУЕТ, я не могу читать программы с тем интерфейсом, который вы на него навешиваете - суть алгоритма теряется) - ТОЛЬКО заполнение дерева данными (причем сами данные - тоже), и поиск, ЧЕГО будем удалять...

Ясно, вот тип дерева:

type PTree = ^TTree;
TTree = record
info:byte;
left,right: PTree;
end;


Вот добавление элемента:
 procedure addelem(var root:PTree;info:byte);
var elem:PTree;
begin
if (root=NIL) then (* Если дерево пустое, то *)
begin
new(elem); (* Создать новый лист *)
elem^.left:=NIL;
elem^.right:=NIL;
elem^.info:=info; (* Записать туда значение требуемого элемента *)
root:=elem; (* Присоединить новый лист вместо пустого дерева *)
end
else (* Иначе *)
begin
if (info<root^.info) then (* Если добавляемое значение меньше текущего узла, то *)
addelem(root^.left,info) (* Добавить его в левое поддерево *)
else (* Иначе *)
addelem(root^.right,info); (* Добавить его в правое поддерево *)
end;
end;


Вот процедура для введение значения:
 function getint(ident:string):byte;
var s:byte;
begin
write('Введите ',ident,' : ');
readln(s);
getint:=s;
end;


Процедура удаление запускается с помощью
 
7: Delete(Tree,getint('элемент для удаления'));


Поиск поддерева я считаю не нужен, просто вводим значение элемента и удаляемся всё что снизу от него.
Надеюсь на этот раз я правильно ответил? unsure.gif
onizuka1988
Спасибо за ответы, решение уже найдено...
LP.by
а можна вапросик??
де найти решение этой задачи??? mega_chok.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.