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

7.3. Двоичные деревья 303

в p посчитан между визитом p во время левого посещения и визитом p справа. Поэтому, мы

имейте O (n) разовый метод для вычисления числа потомков каждого узла в T.

Продолжительность Эйлера совершает поездку, пересечение легко проанализировать, предполагая, что посещение узла берет O (1) время. А именно, в каждом пересечении, мы проводим постоянное количество времени в каждом узле дерева во время пересечения, таким образом, полная продолжительность - O (n) для n дерева узла.

Другое заявление Эйлера совершает поездку, пересечение должно напечатать полностью введенное арифметическое выражение от своего дерева выражения (Пример 7.9). Алгоритм printEx-pression, показанный в Кодовом Фрагменте 7.29, выполняет эту задачу, выполняя следующие действия на туре Эйлера:

• «На левых» действие: если узел внутренний, печать» (»

• «От ниже» действия: напечатайте стоимость или оператора, сохраненного в узле • «На правильном» действии: если узел внутренний, печать»)»

Алгоритм printExpression (T, p):

если p.isExternal () тогда

напечатайте стоимость, сохраненную в p

еще

напечатайте» (» printExpression (T, p.left ()) печатают оператора, сохраненного в p printExpression (T, p.right ()) печать»)»

Кодовый Фрагмент 7.29: алгоритм для печати арифметического выражения связался с поддеревом дерева арифметического выражения T внедренный в p.

7.3.7 Образец функции шаблона

Функции пересечения дерева, описанные выше, являются фактически примерами интересного

ориентированный на объект образец проектирования программного обеспечения, образец функции шаблона. Это не должно быть перепутано с templated классами или функциями в C ++, но руководитель подобен. Образец функции шаблона описывает универсальный механизм вычисления, который может быть специализирован для особого применения, пересмотрев определенные шаги.

Тур Эйлера с образцом функции шаблона

После образца функции шаблона мы можем проектировать алгоритм, шаблон -

EulerTour, который осуществляет универсального Эйлера, совершает поездку по пересечению двоичного дерева. Когда

304

Глава 7. Деревья обратились к узлу p, функция templateEulerTour называет несколько других вспомогательных func-tions в различных фазах пересечения. В первую очередь, это создает структуру с тремя элементами r, чтобы сохранить результат вычисления, называя вспомогательный initRe-sult функции. Затем, если p - внешний узел, templateEulerTour вызывает вспомогательную функцию visitExternal, еще (p внутренний узел), templateEulerTour, выполняет следование - шаги луга:

• Вызывает вспомогательную функцию visitLeft, который выполняет вычисления associ-

ated со столкновением с узлом слева

• Рекурсивно называет себя на покинутом ребенке

• Вызывает вспомогательную функцию visitBelow, который выполняет вычисления asso-

ciated со столкновением с узлом снизу

• Рекурсивно называет себя на правильном поддереве

• Вызывает вспомогательную функцию visitRight, который выполняет вычисления associ-

ated со столкновением с узлом справа

Наконец, templateEulerTour возвращает результат из вычисления, звоня aux-

iliary функционируют returnResult. Функция templateEulerTour может быть рассмотрена как tem-пластина или «скелет» тура Эйлера. (См. Кодовый Фрагмент 7.30.)

Алгоритм templateEulerTour (T, p):

r ¬ initResult()

если p.isExternal () тогда

r.finalResult ¬ visitExternal(T, p, r)

еще

visitLeft (T, p, r)

r.leftResult ¬ templateEulerTour(T, p.left ())

visitBelow (T, p, r)

r.rightResult ¬ templateEulerTour(T, p.right ())

visitRight (T, p, r)

возвратите returnResult (r)

Кодовый Фрагмент 7.30: Функция templateEulerTour для вычисления универсального Эйлера совершает поездку по пересечению поддерева двоичного дерева T внедренный в узле p, после образца функции шаблона. Это вызовы функции функции initResult, visitExter-nal, visitLeft, visitBelow, visitRight, и returnResult.

В ориентированном на объект контексте мы можем тогда написать классу EulerTour что:

• Содержит функцию templateEulerTour

• Содержит все вспомогательные функции, вызванные templateEulerTour как пустые

заполнители (то есть, без инструкций или возвращающий ПУСТОЙ УКАЗАТЕЛЬ)

• Содержит функцию, выполняют, который называет templateEulerTour (T, T.root ())