![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
mind abuse |
![]()
Сообщение
#1
|
![]() Студент ![]() Группа: Пользователи Сообщений: 35 Пол: Мужской Реальное имя: Владимир Репутация: ![]() ![]() ![]() |
Суть проблемы такова: в приложенном файле есть здоровое красивое бинарное дерево с многими удобствами, включая рисование самого себя /*не помню, где скачал, авторство, кажется, то ли volvo, то ли другого пользователя*/ и в нём есть процедура удаления элемента:
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;
Покажите пожалуйста, как переделать её в удаление только листьев, не имеющих соседей.Прикрепленные файлы ![]() -------------------- ...Чего-то хотелось: не то конституции, не то севрюжины с хреном, не то кого-нибудь ободрать.
(М. Е. Салтыков-Щедрин) |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Нет, это программа не моя, это демонстрационная программа по работе с деревьями из FAQ-а форума...
Можно уточнить, что значит, Цитата удаление только листьев, не имеющих соседей. ? Какие листья имеют соседей? Определение "соседства" можно привести? |
mind abuse |
![]()
Сообщение
#3
|
![]() Студент ![]() Группа: Пользователи Сообщений: 35 Пол: Мужской Реальное имя: Владимир Репутация: ![]() ![]() ![]() |
Я подразумеваю лист как узел, не имеющий потомков, соответственно, если от узла b отходят листья a и c, то мы их не трогаем, если только a - удаляем его.
-------------------- ...Чего-то хотелось: не то конституции, не то севрюжины с хреном, не то кого-нибудь ободрать.
(М. Е. Салтыков-Щедрин) |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
По-моему, нигде не ошибся, проверь:
procedure del_leafs(var root: ptree);
function is_leaf(p: ptree): boolean;
begin
is_leaf := (p <> nil) and (p^.right = nil) and (p^.left = nil);
end;
begin
if root <> nil then begin
if (root^.left = nil) then
if is_leaf(root^.right) then begin
dispose(root^.right); root^.right := nil; exit;
end;
if (root^.right = nil) then
if is_leaf(root^.left) then begin
dispose(root^.left); root^.left := nil; exit;
end;
del_leafs(root^.left);
del_leafs(root^.right);
end;
end;
|
mind abuse |
![]()
Сообщение
#5
|
![]() Студент ![]() Группа: Пользователи Сообщений: 35 Пол: Мужской Реальное имя: Владимир Репутация: ![]() ![]() ![]() |
Спасибо! Всё весьма наглядно работает /*хоть на проверку этого сломавшийся компьютер отдал лишь последнтие пять минут своей жизни*/
-------------------- ...Чего-то хотелось: не то конституции, не то севрюжины с хреном, не то кого-нибудь ободрать.
(М. Е. Салтыков-Щедрин) |
![]() ![]() |
![]() |
Текстовая версия | 28.07.2025 2:10 |