Чтение онлайн

на главную - закладки

Жанры

Неизвестно

Шрифт:

Рис. 9. 14. Внесение Х в двоичный справочник в качестве корня.

Ответ мы получим, если учтем следующие ограничения на L1, L2:

L1 и L2 - двоичные справочники;

множество всех вершин, содержащихся как в L1, так и в L2, совпадает с множеством вершин справочника L;

все вершины из L1 меньше, чем X; все вершены из L2 больше, чем X.

Отношение,

которое способно наложить все эти ограничения на L1, L2, - это как раз и есть наше отношение добкор. Действительно, если бы мы вводили Х в L на место корня, то поддеревьями результирующего дерева как раз и оказались бы L1 и L2. В терминах Пролога L1 и L2 должны быть такими, чтобы достигалась цель

добкор( L, X, дер( L1, X, L2) ).

Те же самые ограничения применимы к R1, R2:

добкор( R, X, дер( R1, X, R2) ).

добавить( Д, X, Д1) :- % Добавить Х на место корня

добкор( Д, X, Д1).

добавить( дер( L, Y, R), X, дер( L1, Y, R) ) :-

больше( Y, X), % Ввести Х в левое поддерево

добавить( L, X, L1).

добавить( дер( L, Y, R), X, дер( L, Y, R1) ) :-

больше( X, Y), % Ввести Х в правое поддерево

добавить( R, X, R1).

добкор( nil, X, дер( nil, X, nil) ). % Ввести Х в пустое дерево

добкор( дер( L, Y, R), Х, дер( L1, Х, дер( L2, Y, R) )) :-

больше( Y, X),

добкор( L, X, дер( L1, X, L2) ).

добкор( дep( L, Y, R), X, дep( дep( L, Y, R1), X, R2) ) :-

больше( X, Y),

добкор( R, X, дер( R1, X, R2) ).

Рис. 9. 15. Внесение элемента на произвольный уровень двоичного справочника.

На рис. 9.15 показана программа для "недетерминированного" добавления элемента в двоичный справочник.

Эта процедура обладает тем замечательным свойством, что в нее не заложено никаких ограничений на уровень дерева, в который вносится новый элемент. В связи с этим операцию добавить можно использовать "в обратном направлении" для удаления элемента из справочника. Например, приведенная ниже последовательность целей строит справочник Д, содержащий элементы 3, 5, 1, 6, а затем удаляет из него элемент 5, после чего получается справочник ДД:

добавить( nil, 3, Д1), добавить( Д1, 5, Д2),

добавить( Д2, 1, Д3), добавить(

Д3, 6, Д),

добавить( ДД, 5, Д).

Назад | Содержание | Вперёд

Назад | Содержание | Вперёд

9. 4. Отображение деревьев

Так же, как и любые объекты данных в Прологе, двоичное дерево Т может быть непосредственно выведено на печать при помощи встроенной процедуры write. Однако цель

write( Т)

хотя и отпечатает всю информацию, содержащуюся в дереве, но действительная структура дерева никак при этом не будет выражена графически. Довольно утомительная работа - пытаться представить себе структуру дерева, рассматривая прологовский терм, которым она представлена. Поэтому во многих случаях желательно иметь возможность отпечатать дерево в такой форме, которая графически соответствует его структуре.

Существует относительно простой способ это сделать. Уловка состоит в том, чтобы изображать дерево растущим слева направо, а не сверху вниз, как обычно. Дерево нужно повернуть влево таким образом, чтобы корень стал его крайним слева элементом, а листья сдвинулись вправо (рис. 9.16).

Рис. 9. 16. (а) Обычное изображение дерева. (b) То же дерево,

отпечатанное процедурой отобр (дуги добавлены для ясности).

Давайте определим процедуру

отобр( Т)

так, чтобы она отображала дерево в форме, показанной на рис. 9.16. Принцип работы этой процедуры:

Для того, чтобы отобразить непустое дерево Т, необходимо:

(1) отобразить правое поддерево дерева Т с отступом вправо на расстояние Н;

(2) отпечатать корень дерева Т;

(3) отобразить левое поддерево дерева Т с отступом вправо на расстояние Н.

Величина отступа Н, которую можно выбирать по желанию, - это дополнительный параметр при отображении деревьев. Введем процедуру

отобр2( Т, Н)

печатающую дерево Т с отступом на Н пробелов от левого края листа. Связь между процедурами отобр и отобр2 такова:

отобр( Т) :- отобр2( Т, 0).

На рис. 9.17 показана программа целиком. В этой программе предусмотрен сдвиг на 2 позиции для каждого уровня дерева. Описанный принцип отображения можно легко приспособить для деревьев других типов.

отобр( Т) :-

отобр2( Т, 0).

отобр2( nil, _ ).

отобр2( дер( L, X, R), Отступ) :-

Отступ2 is Отступ + 2,

Поделиться:
Популярные книги

Домашняя медицинская энциклопедия. Симптомы и лечение самых распространенных заболеваний

Коллектив авторов
Научно-образовательная:
медицина
5.00
рейтинг книги
Домашняя медицинская энциклопедия. Симптомы и лечение самых распространенных заболеваний

Монстр из прошлого тысячелетия

Еслер Андрей
5. Соприкосновение миров
Фантастика:
попаданцы
аниме
фэнтези
4.75
рейтинг книги
Монстр из прошлого тысячелетия

Обжигающий север

Медведева Алёна Викторовна
128. Романтическая фантастика
Фантастика:
фэнтези
8.84
рейтинг книги
Обжигающий север

Оружейникъ

Кулаков Алексей Иванович
2. Александр Агренев
Фантастика:
альтернативная история
9.17
рейтинг книги
Оружейникъ

Семейная энциклопедия здоровья

авторов Коллектив
Справочная литература:
энциклопедии
прочая справочная литература
5.00
рейтинг книги
Семейная энциклопедия здоровья

Большая Советская Энциклопедия (МЕ)

Большая Советская Энциклопедия
Справочная литература:
энциклопедии
5.00
рейтинг книги
Большая Советская Энциклопедия (МЕ)

Отморозок 2

Поповский Андрей Владимирович
2. Отморозок
Фантастика:
попаданцы
5.50
рейтинг книги
Отморозок 2

Ветхий Завет. Перевод и комментарии

Щедровицкий Дмитрий Владимирович
Религия и эзотерика:
прочая религиозная литература
5.00
рейтинг книги
Ветхий Завет. Перевод и комментарии

Светоносец. Трилогия

Джонсон Оливер
Светоносец
Фантастика:
фэнтези
5.00
рейтинг книги
Светоносец. Трилогия

Секреты красоты, тайны женской магии. Книга для девочек

Снегирева Алена
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Секреты красоты, тайны женской магии. Книга для девочек

Бояръ-Аниме. Газлайтер. Том 32

Володин Григорий Григорьевич
32. История Телепата
Фантастика:
альтернативная история
аниме
фэнтези
попаданцы
6.40
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 32

Паладин из прошлого тысячелетия

Еслер Андрей
1. Соприкосновение миров
Фантастика:
боевая фантастика
попаданцы
6.67
рейтинг книги
Паладин из прошлого тысячелетия

Вояж с морским дьяволом

Литвиновы Анна и Сергей
Татьяна Садовникова
Детективы:
прочие детективы
7.71
рейтинг книги
Вояж с морским дьяволом

Герои зоны. Пенталогия

Шакилов Александр
Фантастика:
боевая фантастика
5.50
рейтинг книги
Герои зоны. Пенталогия