
- •Теоретическая часть
- •Основные операции с авл-деревом
- •Вставка:
- •Удаление
- •Балансировка после вставки/удаления:
- •Верхняя оценка высоты авл-дерева
- •Красно-черное дерево (rb Tree)
- •Основные операции с красно-черным деревом
- •Балансировка дерева после вставки:
- •Балансировка дерева после удаления:
- •Верхняя оценка высоты красно-черного дерева
- •Практическая часть Асимптотика Бинарное дерево поиска (bst)
- •Лучший случай:
- •Средний случай:
- •Худший случай:
- •Зависимость высоты дерева от количества ключей Бинарное дерево поиска
- •Красно-черное дерево
- •Обходы дерева
- •Обход дерева в ширину
- •Обход дерева в глубину Прямой обход или preorder
- •Симметричый (центрированный) обход или inorder
- •Обратный обход или postorder
- •Код программы Графики для Бинарного дерева поиска:
- •Бинарное дерево поиска:
- •Графики для авл-дерева
- •Графики для кч-дерева
- •Обход деревьев
МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра САПР
отчет
по лабораторной работе №2
по дисциплине «Алгоритмы и структуры данных»
Тема: Самобалансирующиеся двоичные деревья поиска
Студентка гр. 3352 |
|
|
Преподаватель |
|
|
Санкт-Петербург
2024
Цель работы: реализация самобалансирующихся деревьев поиска и экспериментальная проверка оценок высоты данных деревьев.
Задачи для теоретической части:
Дать определение АВЛ дерева. Кратко описать алгоритм вставки/удаления с последующей балансировкой для АВЛ-дерева. Получить верхнюю оценку высоты АВЛ-дерева.
Дать определение красно-черного дерева. Кратко описать алгоритм вставки/удаления с последующей балансировкой для красно-черного дерева.-дерева. Получить верхнюю оценку высоты красно-черного дерева.
Задачи для практической части:
Реализовать бинарное дерево поиска, красно-черное дерево и АВЛ дерево (структура, балансировка, операции вставки/удаления/поиска).
Получить зависимость высоты дерева поиска от количества ключей, при условии, что значение ключа - случайная величина, распределенная равномерно. Определить, какая асимпотика функции h(n) наблюдается у двоичного дерева поиска.
Получить зависимость высоты АВЛ и красно-черного дерева поиска от количества ключей, при условии, что значения ключей монотонно возрастают.
Вывести полученные результаты на графики
Сравнить с теоретической оценкой высоты.
Реализовать обходы в глубину и обход в ширину двоичного дерева с выводом результата.
Теоретическая часть
АВЛ-дерево (AVL Tree)
АВЛ-дерево — это самобалансирующееся двоичное дерево поиска, в котором для каждой вершины выполняется условие балансировки: разница высот левого и правого поддеревьев не превышает 1.
Основные операции с авл-деревом
Вставка:
Допустим,
в дерево нужно вставить узел
.
У
нас есть 3 случа вставки нового узла:
Если меньше текущего узла, нужно перейти в левое поддерево.
Если больше текущего узла, нужно перейти в правое поддерево.
Если достигается пустое место (NULL), создаём новый узел и вставляем значение .
Удаление
Удаление узла из АВЛ-дерева выполняется по стандартным правилам для двоичного дерева поиска:
Удаляемый узел — лист (не имеет потомков): просто удаляем узел.
Удаляемый узел имеет одного потомка: заменяем удаляемый узел его единственным потомком.
Удаляемый узел имеет двух потомков:
Находим наименьший узел в правом поддереве (преемник) или наибольший узел в левом поддереве (предшественник).
Копируем его значение в удаляемый узел.
Рекурсивно удаляем найденный узел (который будет либо листом, либо иметь одного потомка).
Обновление высоты:
После вставки или удаления обновляем высоты всех узлов на пути от добавленного узла к корню:
Проверка баланс-фактора:
Для каждого узла на пути к корню вычисляем его баланс-фактор:
.
Если баланс-фактор выходит за пределы диапазона [−1,1], выполняется балансировка.
Балансировка после вставки/удаления:
Правое вращение (Right Rotation): для левостороннего дисбаланса (левый-левый случай).
Левое вращение (Left Rotation): для правостороннего дисбаланса (правый-правый случай).
Лево-правое вращение (Left-Right Rotation): для левостороннего дисбаланса (левый-правый случай).
Право-левое вращение (Right-Left Rotation): для правостороннего дисбаланса (правый-левый случай).
Верхняя оценка высоты авл-дерева
АВЛ-дерево — это строго сбалансированное двоичное дерево поиска, где разница высот левого и правого поддерева любого узла не превышает 1.
Связь
между числом узлов
и
высотой
:
Мы знаем, что минимальное число узлов в АВЛ-дереве с высотой h имеет вид:
где
– k-ое
число Фибоначчи
Число Фибоначчи:
Из
формулы Бине следует, что для всех
число
.
В частности, при
справедлива асимптотика
.
Фактическое количество узлов n в дереве может быть больше минимального количества m, поэтому справедливо неравенство:
Следовательно, высота ограничена сверху выражением:
Красно-черное дерево (rb Tree)
Красно-черное дерево — это самобалансирующееся двоичное дерево поиска, в котором соблюдаются следующие свойства:
Каждый узел либо красный, либо черный.
Корень дерева — черный.
У всех листовых (пустых) узлов цвет черный.
Если узел красный, оба его потомка — черные (нет двух подряд красных узлов).
На любом пути от корня к листу одинаковое количество черных узлов. Это называется черной высотой.
Основные операции с красно-черным деревом
Вставка
Как и для АВЛ-дерева, у нас есть 3 случа вставки нового узла:
Если меньше текущего узла, нужно перейти в левое поддерево.
Если больше текущего узла, нужно перейти в правое поддерево.
Если достигается пустое место (NULL), создаём новый узел и вставляем значение .
Новый узел всегда окрашивается в красный. Если дерево пустое, новый узел становится черным корнем.
Проверка свойств дерева:
Если родитель нового узла черный, свойства красно-черного дерева сохраняются. Вставка завершена.
Если родитель красный, возможно нарушение свойств. Выполняется балансировка.