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

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

7.1.4 Связанная структура для общих деревьев

Естественный способ понять дерево T состоит в том, чтобы использовать связанную структуру, где мы представляем каждый узел T p объекта положения (см. рисунок 7.5 (a)) со следующими областями: ссылка на элемент узла, связь с родителем узла и некоторая коллекция (например, список или множество), чтобы сохранить связи с детьми узла. Если p - корень T, то родительская область p ПУСТАЯ. Кроме того, мы храним ссылку на корень T и число узлов T во внутренних переменных. Эта структура схематично иллюстрирована в рисунке 7.5 (b).

родитель

PVD

элемент

childrenContainer

ATL BWI JFK СЛАБЫЙ

(a) (b) рисунок 7.5: связанная структура для общего дерева: (a) структура узла; (b) часть структуры данных связался с узлом и его детьми.

Таблица 7.1 суммирует выполнение внедрения связанной структуры дерева. Анализ оставляют как упражнение (C-7.27), но мы отмечаем, что, при помощи контейнера, чтобы сохранить детей каждого узла p, мы можем осуществить детей (p) функция при помощи iterator для контейнера, чтобы перечислить его элементы.

Операция isRoot, isExternal

родительские дети (p) размер, пустой

корень

положения

Время O (1) O (1) O (CP) O (1) O (1) O (n)

Таблица 7.1: Продолжительность функций n-узла связала древовидную структуру. Позвольте CP обозначить число детей узла p. Космическое использование - O (n).

7.2. Алгоритмы пересечения дерева 275

7.2 Алгоритмы пересечения дерева

В этой секции мы представляем алгоритмы для выполнения пересекающихся вычислений на дереве, получая доступ к нему через дерево функции ADT.

7.2.1 Глубина и высота

Позвольте p быть узлом дерева T. Глубина p - число предков p, exclud-

луг p сам. Например, в дереве рисунка 7.2, у узла, хранящего Международный, есть глубина 2. Обратите внимание на то, что это определение подразумевает, что глубина корня T 0. Глубина узла p может также быть рекурсивно определена следующим образом:

• Если p - корень, то глубина p 0

• Иначе, глубина p один плюс глубина родителя p

Основанный на вышеупомянутом определении, рекурсивная глубина алгоритма (T, p) показанный в

Кодовый Фрагмент 7.3, вычисляет глубину узла, на который ссылается положение p T, называя себя рекурсивно на родителе p, и добавление 1 к стоимости возвратилось.

Глубина алгоритма (T, p):

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

возвратитесь 0

еще

возвратитесь 1 + глубина (T, p.parent ())

Кодовый Фрагмент 7.3: алгоритм, чтобы вычислить глубину узла p в дереве T.

Простой C ++ внедрение глубины алгоритма показывают в Кодовом Фрагменте 7.4.

международная глубина (константа Tree& T, константа Position& p)

если (p.isRoot ())

возвратитесь 0; //у корня есть глубина 0

еще

возвратитесь 1 + глубина (T, p.parent ()); //1 + (глубина родителя)

Кодовый Фрагмент 7.4: C ++ внедрение алгоритма Кодового Фрагмента 7.3.

Продолжительность глубины алгоритма (T, p) является O (разность потенциалов), где разность потенциалов обозначает глубину узла p в дереве T, потому что алгоритм выполняет постоянно-разовый рекурсивный шаг для каждого предка p. Таким образом, в худшем случае, алгоритм глубины управляет в O (n) временем, где n - общее количество узлов в дереве T, так как у некоторых узлов может быть эта глубина в T. Хотя такая продолжительность - функция входного размера, более правильно характеризовать продолжительность с точки зрения разности потенциалов параметра, так как это часто намного меньше, чем n.