Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

282 Глава 7. Деревья

формирует пересечение постзаказа дерева T. Эта функция печатает элемент, сохраненный в узле, когда это посещают.

пустота postorderPrint (константа Tree& T, константа Position& p)

PositionList ch = p.children ();

//список детей

для (Iterator q = ch.begin (); q! = ch.end (); ++ q)

postorderPrint (T, *q);

единое время co <<«»;

единое время co <<* p; //печатают элемент

Кодовый Фрагмент 7.13: функция postorderPrint (T, p), который печатает элементы

из поддерева положения p T.

Метод пересечения постзаказа полезен для решения проблем, где мы хотим вычислить некоторую собственность для каждого узла p в дереве, но вычисление, что собственность для p требует, чтобы мы уже вычислили ту же самую собственность для детей p. Такое применение иллюстрировано в следующем примере.

Пример 7.7: Рассмотрите дерево файловой системы T, где внешние узлы представляют файлы

и внутренние узлы представляют справочники (Пример 7.1). Предположим, что мы хотим к com-pute дисковое пространство, используемое справочником, который рекурсивно дан суммой следующего (см. рисунок 7.9):

• Размер самого справочника

• Размеры файлов в справочнике • Пространство использовано детскими справочниками

Рисунок 7.9: дерево рисунка 7.3, представляющего файловую систему, показывая имя и размер связанного файла/справочника в каждом узле и дисковое пространство, используется связанным справочником выше каждого внутреннего узла.

7.2. Алгоритмы пересечения дерева 283

Это вычисление может быть сделано с пересечением постзаказа дерева T. После

поддеревья внутреннего узла p были пересечены, мы вычисляем пространство, использованное p, добавляя размеры справочника p самого и файлов, содержавшихся в p к пространству, использованному каждым внутренним ребенком p, который был вычислен рекурсивными пересечениями постзаказа детей p.

Мотивированный Примером 7.7, алгоритм diskSpace, который представлен в Кодовом Фрагменте 7.14, выполняет пересечение постзаказа дерева файловой системы T, печатая пространство имени и дисковое пространство, используемое справочником, связанным с каждым внутренним узлом T. Когда обращено корень дерева T, diskSpace бежит вовремя O (n), где n - число узлов дерева, обеспечил вспомогательное имя функций (p), и размер (p) берут O (1) время.

интервал diskSpace (константа Tree& T, константа Position& p)

интервал s = размер (p); //начинаются с размера p

если (! p.isExternal ()) //, если p внутренний

PositionList ch = p.children (); //список детей p

для (Iterator q = ch.begin (); q! = ch.end (); ++ q)

s + = diskSpace (T, *q); //суммируют пространство поддеревьев

суд <<имя (p) <<«:» <<s <<endl;//печатают резюме

возвратите s;

Кодовый Фрагмент 7.14: функция diskSpace, который печатает пространство имени и дисковое пространство, используемое справочником, связанным с p для каждого внутреннего узла p дерева файловой системы T. Это вызовы функции вспомогательное имя функций и размер, который должен быть определен, чтобы возвратить имя и размер файла/справочника, связанного с узлом.

Другие виды пересечений

Пересечение перед заказом полезно, когда мы хотим выполнить действие для узла и затем

рекурсивно выполните то действие для его детей и постприкажите, чтобы пересечение было полезно, когда мы хотим сначала выполнить действие на потомках узла и затем выполнить то действие на узле.

Хотя пересечения предварительного заказа и постзаказа - распространенные способы посетить узлы дерева, мы можем также вообразить другие пересечения. Например, мы могли пересечь дерево так, чтобы мы посетили все узлы на глубине d, прежде чем мы посетим узлы на глубине d +1. Такое пересечение, названное пересечением в ширину, могло быть осуществлено, используя очередь, тогда как пересечения предварительного заказа и постзаказа используют стек. (Этот стек неявен в нашем использовании рекурсии, чтобы описать эти функции, но мы могли сделать это использование явным, также, чтобы избежать рекурсии.), Кроме того, двоичные деревья, которые мы обсуждаем затем, поддерживают дополнительный пересекающийся метод, известный как inorder пересечение.