7. ДИНАМИЧЕСКАЯ ПАМЯТЬ
126
ве элемент с заданным значением ключевого признака и т.д., то есть таких задач, решение
которых основывается на алгоритме двоичного поиска по дереву.
Однако не все задачи могут быть решены с применением двоичного поиска, на-
пример, подсчет общего числа узлов дерева. Для этого требуется алгоритм, позволяющий
однократно посещать каждый узел дерева.
При посещении любого узла возможно однократное выполнение следующих трех
действий:
1) обработать узел (конкретный набор действий при этом не важен). Обозначим
это действие через О (обработка);
2) перейти по левой ссылке (обозначение – Л);
3) перейти по правой ссылке (обозначение – П).
Можно организовать обход узлов двоичного дерева, однократно выполняя над каж-
дым узлом эту последовательность действий. Действия могут быть скомбинированы в произ-
вольном порядке, но он должен быть постоянным в конкретной задаче обхода дерева.
На примере дерева на рис. 10 проиллюстрируем варианты обхода дерева.
1) Обход вида ОЛП. Такой обход называется «в прямом порядке», «в глубину».
Он даст следующий порядок посещения узлов:
20, 10, 8, 15, 17, 35, 27, 24, 30
2) Обход вида ЛОП. Он называется «симметричным» и даст следующий порядок
посещения узлов:
8, 10, 15, 17, 20, 24, 27, 30, 35
3) Обход вида ЛПО. Он называется «в обратном порядке» и даст следующий по-
рядок посещения узлов:
8, 17, 15, 10, 24, 30, 27, 35, 20
Если рассматривать задачи, требующие сплошного обхода дерева, то для части из
них порядок обхода, в целом, не важен, например, подсчет числа узлов дерева, числа ли-
стьев/не листьев, элементов, обладающих заданной информацией и т.д. Однако такая за-
дача, как уничтожение бинарного дерева с освобождением памяти, требует использования
только обхода «в обратном порядке».
Рассмотрим средства, с помощью которых можно обеспечить варианты обхода дерева.
При работе с бинарным деревом с точки зрения программирования оптимальным
вариантом построения программы является использование рекурсии. Базисный вариант
рекурсивной процедуры обхода бинарного дерева очень прост.
{ обход дерева по варианту ЛОП }
PROCEDURE RECURS_TREE(Q:ND);
BEGIN
IF Q <> NIL THEN
BEGIN
RECURS_TREE(Q^.LEFT);{уход по левой ветви–Л}
WORK(Q); { процедура обработки дерева–О}
RECURS_TREE(Q^.RIGHT);{уход по правой ветви–П}
END;
END;
Рекурсия в этой программе действует точно так же, как и в рекурсивных процеду-
рах работы со списками: создается цепочка процедур, каждая из которых рекурсивно об-
ращается к себе и затем ожидает завершения вызванной процедуры. Потенциально беско-