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

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

297

Операция

Время

левый, правильный, родитель, isExternal, isRoot

O (1)

размер, пустой

O (1)

корень

O (1)

expandExternal, removeAboveExternal

O (1)

положения

O (n)

Таблица 7.3: Продолжительность для двоичного дерева T осуществленный с вектором S. Мы обозначаем число узлов T с n, и N обозначает размер S. Космическое использование - O (N), который является O (2n) в худшем случае.

7.3.6 Пересечения двоичного дерева

Как с общими деревьями, вычисления двоичного дерева часто включают пересечения.

Предварительно закажите пересечение двоичного дерева

Так как любое двоичное дерево может также быть рассмотрено как общее дерево, пересечение перед заказом для общих деревьев (Кодовый Фрагмент 7.9) может быть применено к любому двоичному дереву. Мы можем упростить алгоритм в случае пересечения двоичного дерева, однако, поскольку мы показываем в Кодовом Фрагменте 7.24. (Также посмотрите Кодовый Фрагмент 7.23.)

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

выполните действие «посещения» для узла p, если p - внутренний узел тогда

binaryPreorder (T, p.left ()) Рекурсивно пересекают оставленное поддерево

binaryPreorder (T, p.right ()) Рекурсивно пересекают правильное поддерево

Кодовый Фрагмент 7.24: Алгоритм binaryPreorder, который выполняет пересечение перед заказом поддерева двоичного дерева T внедренный в узле p.

Например, пересечение перед заказом двоичного дерева, показанного в рисунке 7.14, посещает узлы в СЛАБОМ заказе, BWI, ATL, JFK, PVD. Как имеет место для общих деревьев, есть много применений пересечения перед заказом для двоичных деревьев.

Постзакажите пересечение двоичного дерева

Аналогично, пересечение постзаказа для общих деревьев (Кодовый Фрагмент 7.12) может быть специализировано для двоичных деревьев как показано в Кодовом Фрагменте 7.25.

Пересечение постзаказа двоичного дерева, показанного в рисунке 7.14, посещает узлы в заказе ATL, JFK, BWI, PVD, СЛАБЫЙ.

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

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

если p - внутренний узел тогда

binaryPostorder (T, p.left ()) Рекурсивно пересекают оставленное поддеревоbinaryPostorder (T, p.right ()) Рекурсивно пересекают правильное поддерево

выполните действие «посещения» для узла p

Кодовый Фрагмент 7.25: Алгоритм binaryPostorder для выполнения пересечения постзаказа поддерева двоичного дерева T укоренился в узле p.

Оценка арифметического выражения

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

проблема uation. В этой проблеме нам дают дерево арифметического выражения, то есть, двоичное дерево, где каждому внешнему узлу связали стоимость с нею, и каждый внутренний узел начинает арифметическую операцию, связанную с нею (см. Пример 7.9), и мы хотим вычислить ценность арифметического выражения, представленного деревом.

Алгоритм evaluateExpression, данный в Кодовом Фрагменте 7.26, оценивает экс-pression связанный с поддеревом, внедренным в узле p дерева арифметического выражения T, выполняя пересечение постзаказа T, начинающегося в p. В этом случае действие «посещения» состоит из выполнения единственной арифметической операции.

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

если p - внутренний узел тогда

x ¬ evaluateExpression(T, p.left ()) y¬ evaluateExpression (T, p.right ()) Позволил◦ быть оператором, связанным с x возвращения p y

еще

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

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

Применение оценки дерева выражения пересечения постзаказа обеспечивает O (n) разовый алгоритм для оценки арифметического выражения, представленного двоичным деревом с n узлами. Действительно, как общее пересечение постзаказа, пересечение постзаказа для двоичных деревьев может быть применено к другим «восходящим» проблемам оценки (таким как вычисление размера, данное в Примере 7.7) также. Специализация пересечения постзаказа для двоичных деревьев упрощает это для общих деревьев, однако, потому что мы используем левые и правые функции, чтобы избежать петли, которая повторяет через детей внутреннего узла.

Интересно, специализация общего пересечения предварительного заказа и постзаказа