Условие однозначное, это бинарное дерево. Вершины 1,2,3 соберутся в дерево:
если бы порядок был, например, 2,1,3 то получилось бы:
Кстати решение нашел, может кому пригодится
| Код | Вспомогательный предикат, удаляющий минимальный элемент бинарного дерева. delete1 (tr (nil, Y, R), Y, R). /* Если левое поддерево пусто, то минимальный элемент - корень, а дерево без минимального элемента - это правое поддерево.*/ delete1 (tr (L, K, R), Y, tr (L1, K, R)):- delete1 (L, Y, L1). /* Левое поддерево не пусто, значит, оно содержит минимальное значение всего дерева, которое нужно удалить */ Основной предикат, выполняющий удаление вершины из дерева, будет выглядеть следующим образом.
delete (tr (nil, X, R), X, R, 0):- nl, write ("Элемент из дерева удален."). /* X совпадает с корневым значением исходного дерева, левое поддерево пусто */ delete (tr (L, X, nil), X, L, 0):- nl,write("Элемент из дерева удален."). /* X совпадает с корневым значением исходного дерева, правое поддерево пусто */ delete (T, _, T, 1):- nl,write ("Такого элемента нет!!!"). /*четвертый аргумент 1, поэтому такого элемента в дереве нет.*/ delete (tr (L, X, R), X, tr (L, Y, R1), _):- delete1(R,Y,R1). /* X совпадает с корневым значением исходного дерева, причем ни левое, ни правое поддеревья не пусты */ delete (tr (L, K, R), X, tr (L1, K, R), H):- X<K, delete(L,X,L1,H). /* X меньше корневого значения дерева */ delete (tr (L, K, R), X, tr (L, K, R1), H):- X>K, delete (R, X, R1, H). /* X больше корневого значения дерева */
|
|