Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
45
Добавлен:
23.03.2015
Размер:
884 Кб
Скачать

154 Глава 7

Использогание языка Паскале

intbintree == data type is bt_new, bt_isempty, bt_append_left, bt_append_right, bt.left, bt_right, bt_rootval, bt_destroy

Описание

Бинарные деревья целых чисел intbintree используются для хранения значе­ний типа целые числа. Элемент может присутствовать в нескольких узлах такого дерева. И промежуточные узлы, и листья имеют значения. Бинарные деревья целых чисел intbintree изменяемы.

Операции

function bt_new; intbintree

effects Возвращается .пустое бинарное дерево. function btJsempty (bt: intbintree): boolean effects Возвращается значение true, если дерево bt пусто, и значение

false — в противном случае.

procedure bt_append_left (bt: intbintree; е: integer)

modifies bt effects Добавляется некоторый узел со значением е как самый левый

узел дерева bt.

procedure bt.append_right (bt: intbintree; е: integer)

modifies bt effects Добавляется некоторый узел со значением е как самый правый

узел дерева bt.

function btJeft (bt: intbintree): intbintree requires Чтобы дерево bt было не пустым.

effects Возвращается поддерево дерева bt, чей корень является левым ближайшим потомком корня дерева bt. Это поддерево может быть пустым.

function bt_right (bt: intbintree): intbintree requires Чтобы дерево bt было не пустым,

effects Возвращается поддерево дерева bt, чей корень является пра­вым ближайшим потомком корня дерева bt. Это поддерево может быть пустым.

function bt_rootval (bt: intbintree): integer requires Чтобы дерево bt было не пустым. effects Возвращается значение корневого узла дерева bt. .procedure bt_destroy (bt; intbintree)

modifies bt

effects Освобождается вся память неупорядоченного массива, зани­маемая деревом bt. end intbintree

Рис. 7.12. Спецификация бинарного дерева целых чисел intbintree.

мы получим пустую очередь, то в дереве нужного элемента не было.

На рис. 7.13 приведена реализация функции breadth.first. search. При этом предполагается, что была выполнена конкрет­ная реализация абстракции queue [etype] при помощи замены etype на intbintree и задания имени btq получившемуся типу. Отметим, что функция breadth. firsLsearch использует про­цедуру btq.destroy для освобождения пространства, занимаемого создаваемой очередью. Если это не будет сделано, то память, занимаемая элементами локальной переменной q, была бы поте-

lunction breadth Jiist ^search (bt: intbiiitree; е: integer.): boolean; var q: btq; t: intbintree; found: boolean; begin found ;= false; if not (btJsempty (bt)) then begin q := btq_new; btq_append (q, btq);

while (not (btqJsempty (q)) and not (found)) do begin t := btq_re;nfirst (q); if bt.rootval (t) == e then found :== true else begin if not (btJsempty (bt.left (t))) then btq_append (q, btJeft (t)); if not (btJsempty (bt_right (t))) then btq_append (q, bt_right (t))! end end btq .destroy (q) end;

breadthJirst-search :== found end {функция breadthJirst_search}

Рис. 7.13. Реализация функции breadth, first, search,

ряна. С другой стороны, нет обращения к процедуре bt.dest­roy (t). Прежде чем выйти из операции, мы должны вызвать про­цедуру destroy для освобождения тех объектов, которые были вы­делены динамически в процессе работы этой функции. Хотя функ­ция breadth.first. search делает объявление локальной переме « ной типа бинарного дерева целых чисел intbintree, она не создает ни одного объекта данного типа.

Теперь у нао есть все части, необходимые для получения функции поиска в ширину, которую можно было бы вставить в большую программу. Способ, которым мы объединим эти части, зависит от используемого языка Паскаль. Во многих диалектах языка Паскаль (включая и стандартный язык Паскаль) порядок объявления переменных внутри блока имеет ограничения — сперва делаются все объявления const. затем все объявления type, далее все объявления var и, наконец, все объявления опе­раций. Из этого еледует, что объявление представления неко­торого абстрактного типа не будет соседствовать с реализациями операций над данным типом.

Далее мы предполагаем, что используем язык Паскаль, в ко­тором снято это ограничение и допускается любой порядок объ­явлений. Если для языка Паскаль, у которого более строгие огра­ничения, надо затратить большие усилия по программированию,

Соседние файлы в папке POSIBNIK