, у которого и левое, и правое поддеревья не пусты.
Есть несколько вариантов разрешения возникшей проблемы. Один из
них заключается в следующем. Можно удалить из правого поддерева
минимальный элемент (или из левого дерева максимальный) и заменить им
значение, находящееся в корне . Так как любой элемент правого поддерева
больше любого элемента левого поддерева, дерево , получившееся в
результате такого удаления и замены корневого значения, останется
двоичным справочником .
Для удаления из двоичного справочника вершины, содержащей
минимальный элемент, понадобится отдельный предикат. Его реализация
будет состоять из двух предложений. Первое будет задавать базис рекурсии
и срабатывать в случае, когда левое поддерево пусто. В этой ситуации
минимальным элементом дерева является значение, находящееся в корне ,
потому что, по определению двоичного справочника , все значения,
находящиеся в вершинах правого поддерева, больше значения,
находящегося в корневой вершине. И, значит, достаточно удалить корень ,
а результатом будет правое поддерево.
Второе предложение будет задавать шаг рекурсии и выполняться,
когда левое поддерево не пусто. В этой ситуации минимальный элемент
находится в левом поддереве и его нужно оттуда удалить. Так как
минимальное значение нам потребуется, чтобы вставить его в корневую
вершину, у этого предиката будет не два аргумента, как можно было бы
ожидать, а три. Третий (выходной) аргумент будет нужен нам для
возвращения минимального значения.
tree_del_min(tr(X,empty,R), R, X).
/* Если левое поддерево пусто,
то минимальный элемент - корень,
а дерево без минимального
элемента - это правое поддерево.*/
tree_del_min(tr(K,L,R), tr(K,L1,R), X):-
tree_del_min(L, L1, X).
/* Левое поддерево не пусто,
значит, оно содержит минимальное
значениевсего дерева,
которое нужно удалить */
Основной предикат, выполняющий удаление вершины из дерева ,
будет выглядеть следующим образом.
tree_delete(X,tr(X,empty,R), R):-!.
/* X совпадает с корневым
значением исходного дерева,
левое поддерево пусто */
tree_delete (X,tr(X,L,empty), L):-!.
/* X совпадает с корневым