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

10.2. Деревья avl 445

Исполнение деревьев AVL

Мы суммируем анализ исполнения дерева AVL T следующим образом. Op-

erations находят, вставляют и стирают, посещают узлы вдоль пути корня к листу T, плюс, возможно, их родные братья, и тратят O (1) время за узел. Таким образом, так как высота T - O (зарегистрируйте n) Суждением 10.2, каждая из вышеупомянутых операций берет O (зарегистрируйте n), время. В Таблице 10.2 мы суммируем исполнение карты, осуществленной с деревом AVL. Мы иллюстрируем эту работу в рисунке 10.12.

Операция TimeTime

размер, пустой O (1) находят, вставляют, стирают O (регистрируют n),

Таблица 10.2: Исполнение карты n-входа, понятой деревом AVL. Космическое использование - O (n).

Рисунок 10.12: Иллюстрирование продолжительности поисков и обновлений в дереве AVL. Работа времени - O (1) за уровень, в который врываются вниз фаза, какой typi-cally включает поиск, и фаза, которая, как правило, включает ценности высоты обновления и выполнение местного trinode restructurings (вращения).

446 Глава 10. Деревья поиска

10.2.2 C ++ внедрение дерева AVL

Давайте теперь повернемся к деталям внедрения и анализу использования дерева AVL T с n внутренними узлами, чтобы осуществить заказанный словарь n записей. Вставка и алгоритмы удаления для T требуют, чтобы мы были в состоянии выполнить trinode restruc-turings и определить различие между высотами двух узлов родного брата. Пере - garding restructurings, мы теперь должны удостовериться, что наше основное внедрение дерева двоичного поиска включает метод, реструктурируют (x), который выполняет trinode реструктуризация операции (Кодовый Фрагмент 10.12). (Мы не обеспечиваем implemen-tation этой функции, но это - прямое дополнение к связанному классу двоичного дерева, данному в Разделе 7.3.4.) Легко видеть, что реструктурировать операция может быть выполнена в O (1) время, если T осуществлен со связанной структурой. Мы предполагаем, что класс SearchTree включает эту функцию.

Относительно информации о высоте мы приняли решение сохранить высоту каждого меж - nal узел, v, явно в каждом узле. Альтернативно, мы, возможно, сохранили фактор баланса v в v, который определен как высота покинутого ребенка v минус высота

из правильного ребенка v. Таким образом фактор баланса v всегда равен-1, 0, или 1,

кроме во время вставки или удаления, когда это может стать временно равным

- 2 или +2. Во время выполнения вставки или удаления, высот и баланса

факторы O (регистрируют n) узлы затронуты и могут сохраняться в O (зарегистрируйте n), время.

Чтобы хранить информацию высоты, мы получаем подкласс, названный AVLEntry, от стандартного класса входа, данного ранее в Кодовом Фрагменте 10.3. Это - templated с основным типом входа, от которого это наследует участники стоимости и ключ. Это определяет членскую переменную ht, который хранит высоту поддерева, внедренного в связанном узле. Это обеспечивает членские функции для доступа и урегулирования этой стоимости. Эти функции защищены, так, чтобы пользователь не мог получить доступ к ним, но AVLTree может.

шаблон <typename E>

класс AVLEntry: общественность E //вход AVL

частный:

интервал ht; //никакой de hei g ht защищенный: //местные типы

typedef typename E:: Ключ K; //ключ печатают typedef typename E:: Стоимость V; //оценивают тип

международная высота () константавозвращает ht; //g и hei g ht

пустота setHeight (интервал h)ht = h; //s и hei g ht

общественность: //государственные функции

AVLEntry (константа K& k = K (), константа V& v = V ())//конструктор

: E (k, v), ht (0)

друг класс AVLTree <E>; //позволяют доступ AVLTree

;

Кодовый Фрагмент 10.13: расширенный вход значения ключа для класса AVLTree, содержа

высота связанного узла.