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

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

Класс сам EulerTour не выполняет полезного вычисления. Однако мы

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

Примеры функции шаблона

Как первый пример, мы можем оценить выражение, связанное с арифметикой -

дерево выражения (см. Пример 7.9), сочиняя новому классу EvaluateExpression, что:

•••

Расширяет класс, EulerTour Отвергает функцию initResult, возвращая множество трех чисел, Отвергает функцию visitExternal, возвращая стоимость, сохраненную в узле, Отвергает функцию visitRight, объединяясь r.leftResult и r.rightResult с оператором, сохраненным в узле, и устанавливая r.finalResult равный результату операции

• Отвергает функцию returnResult, возвращаясь r.finalResult

Этот подход должен быть по сравнению с прямым внедрением algo-

rithm, показанный в Кодовом Фрагменте 7.26.

Как второй пример, мы можем напечатать выражение, связанное с арифметикой -

дерево выражения (см. Пример 7.9), использование нового класса PrintExpression, что:

• Расширяет класс EulerTour

• Отвергает функцию visitExternal, печатая ценность переменной или довода «против» -

стент связался с узлом

• Отвергает функцию visitLeft, печатая» (»

• Отвергает функцию visitBelow, печатая оператора, связанного с

узел

• Отвергает функцию visitRight, печатая»)»

Этот подход должен быть по сравнению с прямым внедрением algo-

rithm, показанный в Кодовом Фрагменте 7.29.

C ++ внедрение

Полный C ++ внедрение универсального класса EulerTour и его spe-

cializations EvaluateExpressionTour и PrintExpressionTour показывают в Кодовых Фрагментах 7.31 до 7,34. Они основаны на связанном двоичном дереве implementa-tion.

Мы начинаем, определяя местный Результат структуры с областями leftResult, rightResult, и finalResult, которые хранят промежуточные результаты тура. Чтобы избежать вводить длинные компетентные имена типа, мы даем два определения типа, BinaryTree и Положение, для дерева и положения в дереве, соответственно. Единственный участник данных - указатель на двоичное дерево. Мы обеспечиваем простую функцию, названный инициализируют, который устанавливает этот указатель на существующее двоичное дерево. Остающиеся функции защищены,

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

так как они не призваны непосредственно, а скорее производными классами, которые производят желаемое специализированное поведение.

шаблон <typename E, typename R>

класс EulerTour

защищенный:

Результат struct

R leftResult;

R rightResult; R finalResult;

;

typedef BinaryTree <E> BinaryTree;

//элемент и результат печатают//шаблон для тура Эйлера

//магазины совершают поездку по результатам//следствие левого поддерева//следствие правильного поддерева//объединенный результат

//дерево

typedef typename BinaryTree:: Положение Положения;//положение в дереве

защищенный:

константа BinaryTree* дерево; общественность:

пустота инициализирует (константа BinaryTree& T)

дерево = &T;

защищенный:

//участник данных//указатель на дерево

//инициализировать

//местные утилиты

интервал eulerTour (константа Position& p) константа;//выполняют тур Эйлера

//функции, данные подклассами

виртуальная пустота visitExternal (константа Position& p, Result& r) константа

виртуальная пустота visitLeft (константа Position& p, Result& r) константавиртуальная пустота visitBelow (константа Position& p, Result& r) константавиртуальная пустота visitRight (константа Position& p, Result& r) константаРезультат initResult () константавозвращает Результат ();международный результат (константа Result& r) константавозвращают r.finalResult;

;

Кодовый Фрагмент 7.31: Класс EulerTour, определяющий универсальный тур Эйлера по двоичному дереву.

Этот класс понимает образец функции шаблона и должен быть специализирован, чтобы произвести интересное вычисление.

Затем, в Кодовом Фрагменте 7.32, мы представляем основную пересекающуюся функцию, вызванную eulerTour. Эта рекурсивная функция выполняет пересечение Эйлера на дереве и в - полевки соответствующие функции, когда это идет. Если бы управляется на универсальном дереве Эйлера, noth-интересный луг закончился бы, потому что эти функции (как определено в Кодовом Frag-ment 7.31) ничего не делают. Это до полученных функций, чтобы предоставить более интересные определения для этих универсальных функций.

В Кодовом Фрагменте 7.33, мы представляем наш первый пример производного класса нас - луг образец шаблона, названный EvaluateExpressionTour. Это оценивает дерево арифметического выражения целого числа. Мы предполагаем, что каждый внешний узел дерева выражения обеспечивает функцию, вызванную стоимость, которая возвращает стоимость, связанную с этим узлом. Мы предполагаем, что каждый внутренний узел дерева выражения обеспечивает функцию, вызванную операция, которая выполняет операцию, связанную с этим узлом к этим двум операндам, являющимся результатом его левых и правых поддеревьев, и возвращает результат.