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

10.2. Деревья avl 447

В Кодовом Фрагменте 10.14, мы представляем определение класса для AVLTree. Это

класс получен из класса SearchTree, но использование нашего расширенного AVLEntry, чтобы поддержать информацию о высоте для узлов дерева. Класс определяет много typedef коротких путей для обращения к предприятиям, таким как ключи, ценности и положения дерева. Класс объявляет все стандартные функции члена общественности словаря. В конце это также определяет много защищенных сервисных функций, которые используются в поддержании свойств баланса дерева AVL.

шаблон <typename E> //дерево AVL

класс AVLTree: общественный SearchTree <AVLEntry <E>>

общественность: //общественные типы

typedef AVLEntry <E> AVLEntry; //вход

typedef typename SearchTree <AVLEntry>:: Iterator Iterator;//iterator

защищенный:

typedef typename AVLEntry:: Ключ K; typedef typename AVLEntry:: Стоимость V; typedef СИРЧТРИ <АВЛЕНТРИ>-СТРИТ; typedef typename СВ.:: TPos TPos;

общественность:

AVLTree (); вставка Iterator (константа K& k, константа V& x);

//местные типы//ключ//стоимость//дерево поиска//положение дерева//государственные функции//конструктор//вставка (k, x)

пустота стирает (константа K& k) бросок (NonexistentElement);//удаляют ключ k вход

пустота стирает (константа Iterator& p); защищенный:

международная высота (константа TPos& v) константа; пустота setHeight (TPos v); bool isBalanced (константа TPos& v) константа; TPos tallGrandchild (константа TPos& v) константа; недействительный перебаланс (константа TPos& v);

;

//удалите вход в p//сервисные функции//полезность высоты узла//полезность высоты набора / / я s v шахта anced?//получают самого высокого внука//полезность перебаланса

Кодовый Фрагмент 10.14: Класс AVLTree, внедрение дерева AVL словаря.

Затем, в Кодовом Фрагменте 10.15, мы представляем конструктора и сервисную функцию высоты. Конструктор просто призывает конструктора для дерева двоичного поиска, которое создает дерево, имеющее записи. Высота функции возвращает высоту узла, извлекая информацию о высоте из AVLEntry. Мы используем сжатое примечание функции, которое мы ввели в Разделе 9.2.7.

/* AVLTree E:: */

AVLTree (): СВ. ()/* AVLTree E:: */

международная высота (константа TPos& v) константа

возвращаются (v.isExternal ()? 0: v-> высота ());

//конструктор

//полезность высоты узла

Кодовый Фрагмент 10.15: конструктор для класса AVLTree и полезность для извлечения

высоты.

448

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

В Кодовом Фрагменте 10.16, мы представляем несколько сервисных функций, необходимых для основного - taining баланс дерева. Функция setHeight устанавливает информацию о высоте для узла как еще один, чем максимум высот его двух детей. func-tion isBalanced определяет, удовлетворяет ли узел условие баланса AVL, проверяя, что разности высот между ее детьми самое большее 1 год. Наконец, функция tallGrandchild определяет самого высокого внука узла. Вспомните, что эта процедура необходима операции по удалению, чтобы определить узел, к которому будет применена операция по реструктуризации.

/* AVLTree E:: */

пустота setHeight (TPos v)

интервал hl = высота (v.left ());

международный час = высота (v.right ());

v-> setHeight (1 + станд.:: макс. (hl, час));

/* AVLTree E:: */

bool isBalanced (константа TPos& v) константа

международная шахта = высота (v.left ())- высота (v.right ()); возвратитесь ((-1 <= шахта) && (шахта <= 1));

/* AVLTree E:: */

TPos tallGrandchild (константа TPos& z) константа

TPos zl = z.left ();

Цирконий TPos = z.right (); если (высота (zl)> = высота (цирконий))

если (высота (zl.left ())> = высота (zl.right ()))

возвратите zl.left ();

еще

возвратите zl.right ();

еще

если (высота (zr.right ())> = высота (zr.left ()))

возвратите zr.right ();

еще

возвратите zr.left ();

//полезность высоты набора

//макс. левых & правильных

/ / я s v шахта anced?

//получите самого высокого внука

//оставленный более высокий ребенок

//правильный более высокий ребенок

Кодовый Фрагмент 10.16: Некоторые сервисные функции используются для того, чтобы сохранить равновесие в дереве AVL.

Затем, мы представляем основную функцию для перебалансирования дерева AVL после вставки или удаления. Процедура начинается в узле v затронутый операцией. Это тогда идет по дереву к уровню корня. При посещении каждого узла z, это обновляет информацию о высоте z (который, возможно, изменился из-за операции по обновлению), и