Здравствуйте, искал уже подобную задачу, нашёл модуль для работы с ней, но там нету одной процедуры. Вот сама задача: Разработайте программу работы с бинарным деревом. Программа должна содержать следующие процедуры, вызывае-мые из меню: - построение пустого дерева; - добавление нового элемента; - удаление указанного поддерева; - просмотр дерева в следующем порядке: левая ветвь, узел, правая ветвь. А вот там процедура которой у меня нету - удаление указанного поддерева Буду очень благодарен, если кто нибуть поможеш с данной программой (желательно целиком, но если нет - то можно и процедуру).
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; 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;
Так вот, как я понимаю, если одинаковых элементов в дереве не будет, то соответственно не обязательно нужна процедура поиска поддерева. Нужно переделать Вашу процедуру, просто указываеться элеменет, который нужно удалить, после чего удаляется заданный элемент и все его ветвления вправо и влево. Если сможете, помогите дописать.
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; 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('элемент для удаления'));
Поиск поддерева я считаю не нужен, просто вводим значение элемента и удаляемся всё что снизу от него. Надеюсь на этот раз я правильно ответил?
onizuka1988
27.12.2006 5:08
Спасибо за ответы, решение уже найдено...
LP.by
9.01.2007 0:38
а можна вапросик?? де найти решение этой задачи???
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.