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

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

Высота узла p в дереве T также определена рекурсивно.

• Если p внешний, то высота p 0

• Иначе, высота p один плюс максимальная высота ребенка p

Высота дерева T является высотой корня T. Например, дерево

У рисунка 7.2 есть высота 4. Кроме того, высота может также быть рассмотрена следующим образом.

Суждение 7.4: высота дерева равна максимальной глубине его exter -

узлы nal.

Мы оставляем оправдание этого факта к упражнению (R-7.7). Основанный на этом суждении, мы представляем алгоритм, height1, для вычисления высоты дерева T. Это показывают в Кодовом Фрагменте 7.5. Это перечисляет все узлы в дереве и призывает глубину функции (Кодовый Фрагмент 7.3), чтобы вычислить глубину каждого внешнего узла.

Алгоритм height1 (T):

h=0

для каждого pÎ T.positions () делают

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

h = макс. (h, глубина (T, p))

возвратите Кодовый Фрагмент h 7.5: Алгоритм height1 (T) для вычисления высоты дерева T основанный на вычислении максимальной глубины внешних узлов.

C ++ внедрение этого алгоритма показывают в Кодовом Фрагменте 7.6. Мы предполагаем, что Iterator - iterator класс для PositionList. Учитывая такой iterator q, мы можем получить доступ к связанной позиции как *q.

интервал height1 (константа Tree& T)

интервал h = 0;

Узлы PositionList = T.positions ();

/ / l i s t o f al l никакой des

для (Iterator q = nodes.begin (); q! = nodes.end (); ++ q)

если (q-> isExternal ())

h = макс. (h, глубина (T, *q)); //получают макс. глубину среди листьев

возвратите h;

Кодовый Фрагмент 7.6: C ++ внедрение функции height1.

К сожалению, алгоритм height1 не очень эффективен. Так как height1 называет algo-

глубина rithm (p) на каждом внешнем узле p T, продолжительность height1 дана O (n +åp (1 + разность потенциалов)), где n - число узлов T, разность потенциалов - глубина узла p, и E - набор внешних узлов T. В худшем случае, суммаåp (1 + разность потенциалов)

пропорционально n2. (См. Упражнение C-7.8.) Таким образом алгоритм height1 управляет в O (n2) временем.

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

Алгоритм height2, показанный в Кодовом Фрагменте 7.7 и осуществленный в C ++ в

Кодовый Фрагмент 7.8, вычисляет высоту дерева T более эффективным способом при помощи рекурсивного определения высоты.

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

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

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

еще

h=0

для каждого qÎ p.children () делают

h = макс. (h, height2 (T, q))

возвратитесь 1 + h Кодовый Фрагмент 7.7: более эффективный алгоритм для вычисления высоты поддерева дерева T укоренился в узле p.

интервал height2 (константа Tree& T, константа Position& p)

если (p.isExternal ()) возвращаются 0; //l у eaf есть hei g ht 0

интервал h = 0; PositionList ch = p.children (); //список детей

для (Iterator q = ch.begin (); q! = ch.end (); ++ q)

h = макс. (h, height2 (T, *q));

возвратитесь 1 + h; //1 + макс. высота детей

Кодовый Фрагмент 7.8: Метод height2 написанный в C ++.

Алгоритм height2 более эффективен, чем height1 (от Кодового Фрагмента 7.5).

Алгоритм рекурсивный, и, если это первоначально назовут на корне T, то это в конечном счете назовут на каждом узле T. Таким образом мы можем определить продолжительность этого метода, суммировав, по всем узлам, количество времени, проведенное в каждом узле (на нерекурсивной части). Обрабатывая каждый узел в детях (p) берет O (CP) время, где CP обозначает число детей узла p. Кроме того, в то время как у петли есть повторения CP и каждое повторение петли, берет O (1) время плюс время для рекурсивного вызова на ребенке p. Таким образом алгоритм height2 тратит O (1 + CP) время в каждом узле p, и его продолжительность - O (åp (1 + CP)). Чтобы закончить анализ, мы используем следующую собственность. Суждение 7.5: Позвольте T быть деревом с n узлами и позволить CP обозначить число

дети узла p T. ТогдаCP åp = n- 1.

Оправдание: Каждый узел T, за исключением корня, является ребенком другого узла, и таким образом вносит одну единицу в вышеупомянутую сумму.

Суждением 7.5, продолжительность алгоритма height2, когда обращено корень T, является O (n), где n - число узлов T.