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

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

Используя пересечение Inorder для рисунка дерева

inorder пересечение может также быть применено к проблеме вычисления рисунка

двоичное дерево. Мы можем потянуть двоичное дерево T с алгоритмом, который назначает x-и y-координаты к узлу p T использование следующих двух правил (см. рисунок 7.20).

x (p) - число узлов, которые посещают прежде p в inorder пересечении T.

y (p) - глубина p в T.

В этом применении мы берем соглашение, распространенное в компьютерной графике это x-

координаты увеличиваются слева направо и увеличение y-координат, от начала до конца. Таким образом, происхождение находится в левом верхнем углу монитора.

Рисунок 7.20: inorder рисование алгоритма для двоичного дерева.

Туристическое пересечение Эйлера двоичного дерева

Пересекающиеся деревом алгоритмы, которые мы обсудили до сих пор, являются всеми формами iterators.

Каждое пересечение посещает узлы дерева в определенном заказе и, как гарантируют, посетит каждый узел точно однажды. Мы можем объединить пересекающиеся деревом алгоритмы, данные выше в единственную структуру, однако, расслабив требование что каждый узел быть посещенными точно однажды. Получающийся пересекающийся метод называют туристическим пересечением Эйлера, которое мы изучаем затем. Преимущество этого пересечения состоит в том, что оно допускает более общие виды алгоритмов, которые будут выражены легко.

Туристическое пересечение Эйлера двоичного дерева T может быть неофициально определено как «прогулка» вокруг T, где мы начинаем, идя с корня к его покинутому ребенку, рассматривая края T, как являющегося «стенами», что мы всегда придерживаемся нашего левого. (См. рисунок 7.21.) С каждым узлом p T сталкивается три раза тур Эйлера:

• «Слева» (прежде чем тур Эйлера по левому поддереву p)

• «Снизу» (между турами Эйлера по двум поддеревьям p) • «Справа» (после тура Эйлера по правильному поддереву p)

Если p внешний, то эти три «посещения» фактически все происходят в то же время.

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

Рисунок 7.21: туристическое пересечение Эйлера двоичного дерева.

Мы даем псевдокодекс для тура Эйлера по поддереву, внедренному в узле p в Кодовом Фрагменте 7.28.

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

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

рекурсивно совершите поездку по левому поддереву p, звоня eulerTour (T, p.left ()) выполняют действие для посещения узла p снизу, если p - внутренний узел тогда

рекурсивно совершите поездку по правильному поддереву p, звоня eulerTour (T, p.right ())

выполните действие для посещения узла p на правильном Кодовом Фрагменте 7.28: Алгоритм eulerTour для вычисления Эйлера совершает поездку по пересечению поддерева двоичного дерева T внедренный в узле p.

Пересечение перед заказом двоичного дерева эквивалентно туристическому пересечению Эйлера, в котором у каждого узла есть связанное действие «посещения», происходят только, когда это encoun-усталый слева. Аналогично, inorder и пересечения постзаказа двоичного дерева эквивалентны туру Эйлера, где у каждого узла есть связанное действие «посещения», происходят только, когда с этим сталкиваются снизу или справа, соответственно.

Туристическое пересечение Эйлера расширяет предварительный заказ, inorder, и пересечения постзаказа, но это может также выполнить другие виды пересечений. Например, предположите, что мы хотим вычислить число потомков каждого узла p в n двоичном дереве узла T. Мы начинаем тур Эйлера, инициализируя в противоречии с 0, и затем увеличиваем прилавок каждый раз, когда мы посещаем узел слева. Чтобы определить число потомков узла p, мы вычисляем различие между ценностями прилавка, когда p посещают слева и когда это посещают справа, и добавьте 1. Это простое правило дает нам число потомков p, потому что каждый узел во внедренном поддереве