1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Двоичное дерево: Удаление листьев, не имеющих соседей., Покажите пожалуйста, как переделать процедуру.
Суть проблемы такова: в приложенном файле есть здоровое красивое бинарное дерево с многими удобствами, включая рисование самого себя /*не помню, где скачал, авторство, кажется, то ли volvo, то ли другого пользователя*/ и в нём есть процедура удаления элемента:
procedure delelem(var root:PTree;info:byte);
var temp:PTree;
beginif (root<>NIL) then(* Если дерево не пустое, то *)beginif (info<root^.info) then(* Если удаляемый элемент меньше тек. узла, то *)
delelem(root^.left,info) (* Удалить его из левого поддерева *)else(* Иначе *)if (info>root^.info) then(* Если удаляемый элемент больше тек. узла, то *)
delelem(root^.right,info) (* Удалить его из правого поддерева *)else(* Иначе тек. узел - удаляемый элемент *)beginif (root^.left=NIL) and (root^.right=NIL) then(* Если тек. узел - лист, то *)begin
dispose(root); (* Удалить его *)
root:=NIL; (* Поставить на его место пустое дерево *)endelseif (root^.left=NIL) and (root^.right<>NIL) then(* Если у тек.узла есть только правая ветвь *)begin
temp:=root; (* Присоединить её вместо тек. узла *)
root:=root^.right;
dispose(temp); (* Удалить тек. узел *)endelseif (root^.left<>NIL) and (root^.right=NIL) then(* Если у тек.узла есть только левая ветвь *)begin
temp:=root; (* Присоединить её вместо тек. узла *)
root:=root^.left;
dispose(temp); (* Удалить тек. узел *)endelse(* Иначе у узла есть обе ветви *)begin
root^.info:=getmostright(root^.left);
(* Вставить на место узла самый правый эл-т левого поддерева *)
delelem(root^.left,root^.info);
(* Удалить самый правый эл-т из левого поддерева *)end;
end;
end;
end;
Покажите пожалуйста, как переделать её в удаление только листьев, не имеющих соседей.
Я подразумеваю лист как узел, не имеющий потомков, соответственно, если от узла b отходят листья a и c, то мы их не трогаем, если только a - удаляем его.
--------------------
...Чего-то хотелось: не то конституции, не то севрюжины с хреном, не то кого-нибудь ободрать. (М. Е. Салтыков-Щедрин)