Помощь - Поиск - Пользователи - Календарь
Полная версия: Бинарное дерево (который раз)
Форум «Всё о Паскале» > 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
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.