Программирование на языке Пролог для искусственного интеллекта
Шрифт:
• Результат добавления элемента X к пустому дереву есть дерево
• Если X совпадает с корнем дерева Д, то Д1 = Д (в множестве не допускается дублирования элементов).
• Если корень дерева Д больше, чем X, то X вносится в левое поддерево дерева Д; если корень меньше, чем X, то X вносится в правое поддерево.
На рис. 9.10 показана соответствующая программа.
Теперь рассмотрим операцию удалить. Лист дерева удалить легко, однако удалить какую-либо внутреннюю вершину — дело не простое. Удаление листа можно на самом деле определить как операцию, обратную операции добавления листа:
Рис. 9.11. Удаление X из двоичного справочника. Возникает проблема наложения "заплаты" на место удаленного элемента X.
К сожалению, если X — это внутренняя вершина, то такой способ не работает, поскольку возникает проблема, иллюстрацией к которой служит рис. 9.11. Вершина X имеет два поддерева
Если одно из поддеревьев Лев и Прав пусто, то существует простое решение: подсоединить к А непустое поддерево. Если же оба поддерева непусты, то можно использовать следующую идею (рис. 9.12): если самую левую вершину Y поддерева
Рис. 9. 2. Заполнение пустого места после удаления X.
На рис. 9.13 показана программа, реализующая операцию удаления элементов в соответствии с изложенными выше соображениями. Основную работу по перемещению самой левой вершины выполняет отношение
Здесь Y — минимальная (т.е. самая левая) вершина дерева
Существует другой, элегантный способ реализация операции добавить и удалить. Отношение добавить можно сделать недетерминированным в том смысле, что новый элемент вводится на произвольный уровень дерева, а не только на уровень листьев. Правила таковы:
Для того, чтобы добавить X в двоичный справочник Д, необходимо одно из двух:
• добавить X на место корня дерева (так, что X станет новым корнем) или
• если корень больше, чем X, то внести X в левое поддерево, иначе — в правое поддерево.
Рис. 9.13. Удаление элемента из двоичного справочника.
Трудным моментом здесь является введение X на место корня. Сформулируем эту операций в виде отношения
где X — новый элемент, вставляемый вместо корня в Д, а Д1 — новый справочник с корнем X. На рис. 9.14 показано, как соотносятся X, Д и Д1. Остается вопрос: что из себя представляют поддеревья L1 и L2 (или, соответственно, R1 и R2) на рис. 9.14?
Рис. 9.14. Внесение X в двоичный справочник в качестве корня.
Ответ мы получим, если учтем следующие ограничения на L1, L2:
• L1 и L2 — двоичные справочники;
• множество всех вершин, содержащихся как в L1, так и в L2, совпадает с множеством вершин справочника L;
• все вершины из L1 меньше, чем X; все вершены из L2 больше, чем X.
Отношение, которое способно наложить все эти ограничения на L1, L2, — это как раз и есть наше отношение
Те же самые ограничения применимы к R1, R2:
На рис. 9.15 показана программа для "недетерминированного" добавления элемента в двоичный справочник.
Рис. 9.15. Внесение элемента на произвольный уровень двоичного справочника.
Эта процедура обладает тем замечательным свойством, что в нее не заложено никаких ограничений на уровень дерева, в который вносится новый элемент. В связи с этим операцию добавить можно использовать "в обратном направлении" для удаления элемента из справочника. Например, приведенная ниже последовательность целей строит справочник Д, содержащий элементы 3, 5, 1, 6, а затем удаляет из него элемент 5, после чего получается справочник ДД: