IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Бинарное дерево (который раз), Нужна помощ с одной процедурой
onizuka1988
сообщение 22.12.2006 12:18
Сообщение #1





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


Здравствуйте, искал уже подобную задачу, нашёл модуль для работы с ней, но там нету одной процедуры.
Вот сама задача:
Разработайте программу работы с бинарным деревом. Программа должна содержать следующие процедуры, вызывае-мые из меню:
- построение пустого дерева;
- добавление нового элемента;
- удаление указанного поддерева;
- просмотр дерева в следующем порядке: левая ветвь, узел, правая ветвь.
А вот там процедура которой у меня нету - удаление указанного поддерева
Буду очень благодарен, если кто нибуть поможеш с данной программой (желательно целиком, но если нет - то можно и процедуру).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
onizuka1988
сообщение 24.12.2006 18:50
Сообщение #2





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


Вот Процедура удаления самого элемента:

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;


Так вот, как я понимаю, если одинаковых элементов в дереве не будет, то соответственно не обязательно нужна процедура поиска поддерева. Нужно переделать Вашу процедуру, просто указываеться элеменет, который нужно удалить, после чего удаляется заданный элемент и все его ветвления вправо и влево.
Если сможете, помогите дописать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 18:16
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"