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

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

шаблон <typename E, typename R> //делают тур

международный EulerTour <E, R>:: eulerTour (константа Position& p) константа

Результат r = initResult ();

если (p.isExternal ())

visitExternal (p, r);

//внешний узел

еще

visitLeft (p, r);

r.leftResult = eulerTour (p.left ()); visitBelow (p, r); r.rightResult = eulerTour (p.right ()); visitRight (p, r);

возвратите результат (r);

//внутренний узел

//перепроклятие на левом

//перепроклятие на праве

Кодовый Фрагмент 7.32: основной участник функционирует eulerTour, который рекурсивно

пересекает дерево и накапливает результаты.

Используя эти две функции, мы можем оценить выражение рекурсивно, поскольку мы пересекаем дерево. Главная точка входа - функция, выполняют, который инициализирует дерево, призывает рекурсивный тур Эйлера, начинающийся в корне, и печатает конечный результат. Например, учитывая дерево выражения рисунка 7.21, эта процедура произвела бы последовательность «Стоимость:-13».

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

класс EvaluateExpressionTour: общественный EulerTour <E, R>

защищенный: //короткий путь вводят имена

typedef typename EulerTour <E, R>:: BinaryTree BinaryTree; typedef typename EulerTour <E, R>:: Положение Положения; typedef typename EulerTour <E, R>:: Результат Результата;

общественность:

пустота выполняет (константа BinaryTree& T)

инициализируйте (T);

//осуществите тур

станд.:: суд <<«Стоимость: «<<eulerTour (T.root ()) <<» \n»;

защищенный: //лист: возвращаемое значение

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

r.finalResult = (*p) .value ();

//внутренний: сделайте операцию

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

r.finalResult = (*p) .operation (r.leftResult, r.rightResult);

;

Кодовый Фрагмент 7.33: Внедрение класса EvaluateExpressionTour, который специализирует EulerTour, чтобы оценить выражение, связанное с арифметикой - дерево выражения.

308

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

Наконец, в Кодовом Фрагменте 7.34, мы представляем второй пример производного класса, названного PrintExpressionTour. В отличие от предыдущей функции, которая оценивает ценность дерева выражения, эти печати выражение. Мы предполагаем, что каждый узел дерева выражения обеспечивает функцию, вызванную печать. Для каждого внешнего узла эта функция печатает стоимость, связанную с этим узлом. Для каждого внутреннего узла эта функция печатает оператора, например, печатая «+» для дополнения или «*» для умножения.

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

класс PrintExpressionTour: общественный EulerTour <E, R>

защищенный://.. .same печатают короткие пути имени как в EvaluateExpressionTour

общественность:

пустота выполняет (константа BinaryTree& T) //осуществляют тур

инициализируйте (T);

суд <<«Выражение»:; eulerTour (T.root ()); суд <<endl;

защищенный: //лист: стоимость печати

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

(*p) .print ();

//оставленный: откройте новое выражение

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

co единое время <<«(»;

//ниже: оператор печати

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

(*p) .print ();

//право: близкое выражение

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

co единое время <<«)»;

;

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

Входя в поддерево, функция visitLeft была отвергнута, чтобы напечатать» (»

и при переходе из поддерева, функция visitRight была отвергнута, чтобы напечатать»), «. Главная точка входа - функция, выполняют, который инициализирует дерево и призывает рекурсивный тур Эйлера, начинающийся в корне. Когда объединено, эти функции печатают все выражение (хотя с большим количеством избыточных круглых скобок). Например, учитывая дерево выражения рисунка 7.21, эта процедура произвела бы следующую последовательность.

((((3 + 1) * 3) / ((9 - 5) + 2)) - ((3 * (7 - 4)) + 6))