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

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

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

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





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

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


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

 





- Текстовая версия 27.04.2024 0:35
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name