Здравствуйте, искал уже подобную задачу, нашёл модуль для работы с ней, но там нету одной процедуры. Вот сама задача: Разработайте программу работы с бинарным деревом. Программа должна содержать следующие процедуры, вызывае-мые из меню: - построение пустого дерева; - добавление нового элемента; - удаление указанного поддерева; - просмотр дерева в следующем порядке: левая ветвь, узел, правая ветвь. А вот там процедура которой у меня нету - удаление указанного поддерева Буду очень благодарен, если кто нибуть поможеш с данной программой (желательно целиком, но если нет - то можно и процедуру).
volvo
22.12.2006 17:32
Цитата(onizuka1988 @ 22.12.2006 11:18)
А вот там процедура которой у меня нету - удаление указанного поддерева
Погоди...
Есть же процедура "удаление дерева"? Так вот, если ее вызвать, вместо корня дерева передав ей узел, который (вместе со всеми его потомками) надо удалить - то это будет сделано...
onizuka1988
23.12.2006 1:15
Цитата(volvo @ 22.12.2006 12:32)
Погоди...
Есть же процедура "удаление дерева"? Так вот, если ее вызвать, вместо корня дерева передав ей узел, который (вместе со всеми его потомками) надо удалить - то это будет сделано...
Хм, для своей программы я использовал данную заготовку, где с помошью меню реализованы 11 функций для работы с бинарным деревом. Процедуру удаления дерева мне не удалось переделать. Не могли бы ли Вы мне в этом помоч? Буду очень благодарен.
volvo
23.12.2006 1:18
Тогда показывай код инициализации и заполнения дерева, и код поиска ПОДдерева, которое надо будет удалить - я напишу, КАК его удалить...
onizuka1988
24.12.2006 22:50
Вот Процедура удаления самого элемента:
procedure delelem(var root:PTree;info:byte);
var temp:PTree;
beginif (root<>NIL) then(* Если дерево не пустое, то *)beginif (info<root^.info) then(* Если удаляемый элемент меньше тек. узла, то *)
delelem(root^.left,info) (* Удалить его из левого поддерева *)else(* Иначе *)if (info>root^.info) then(* Если удаляемый элемент больше тек. узла, то *)
delelem(root^.right,info) (* Удалить его из правого поддерева *)else(* Иначе тек. узел - удаляемый элемент *)beginif (root^.left=NIL) and (root^.right=NIL) thenbegin(* Если тек. узел - лист, то *)(* Удалить его *)
dispose(root);
(* Поставить на его место пустое дерево *)
root:=NIL;
endelseif (root^.left=NIL) and (root^.right<>NIL) thenbegin(* Если у тек.узла есть только правая ветвь *)(* Присоединить её вместо тек. узла *)
temp:=root;
root:=root^.right;
(* Удалить тек. узел *)
dispose(temp);
endelseif (root^.left<>NIL) and (root^.right=NIL) thenbegin(* Если у тек.узла есть только левая ветвь *)(* Присоединить её вместо тек. узла *)
temp:=root;
root:=root^.left;
(* Удалить тек. узел *)
dispose(temp);
endelse(* Иначе у узла есть обе ветви *)begin(* Вставить на место узла самый правый эл-т левого поддерева *)
root^.info:=getmostright(root^.left);
(* Удалить самый правый эл-т из левого поддерева *)
delelem(root^.left,root^.info);
end;
end;
end;
end;
Непомню, где то сдесь на форуме брал это из программы, где есть все функции для работы с бинарным деревом. А вот процедура из Вашего модуля:
Так вот, как я понимаю, если одинаковых элементов в дереве не будет, то соответственно не обязательно нужна процедура поиска поддерева. Нужно переделать Вашу процедуру, просто указываеться элеменет, который нужно удалить, после чего удаляется заданный элемент и все его ветвления вправо и влево. Если сможете, помогите дописать.
volvo
24.12.2006 22:55
А теперь подними глаза и перечитай мой пост выше... Ты сделал с точностью "до наоборот" - то, что я НЕ просил - ты привел, а то, что я ПРОСИЛ - нет... Вот и я сделаю точно так же - я не буду ничего отвечать, пока ты не научишься ЧИТАТЬ ответы... Я ж не просто так прошу тебя привести ТВОЙ вариант, неужели же не ясно??? Я все сделаю правильно (создание дерева, поиск поддерева), удалю как положено - приведу тебе функцию, ты скажешь "НЕ работает"... Мне это надо? Не надо... Вот и приведи СВОЕ заполнение/поиск поддерева (не надо всю программу, меня твой интерфейс НЕ ИНТЕРЕСУЕТ, я не могу читать программы с тем интерфейсом, который вы на него навешиваете - суть алгоритма теряется) - ТОЛЬКО заполнение дерева данными (причем сами данные - тоже), и поиск, ЧЕГО будем удалять...
onizuka1988
24.12.2006 23:08
Цитата(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;
beginif (root=NIL) then(* Если дерево пустое, то *)begin
new(elem); (* Создать новый лист *)
elem^.left:=NIL;
elem^.right:=NIL;
elem^.info:=info; (* Записать туда значение требуемого элемента *)
root:=elem; (* Присоединить новый лист вместо пустого дерева *)endelse(* Иначе *)beginif (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('элемент для удаления'));
Поиск поддерева я считаю не нужен, просто вводим значение элемента и удаляемся всё что снизу от него. Надеюсь на этот раз я правильно ответил?
onizuka1988
27.12.2006 5:08
Спасибо за ответы, решение уже найдено...
LP.by
9.01.2007 0:38
а можна вапросик?? де найти решение этой задачи???
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.