АВЛ - деревья / АВЛ
.docЗадание:
Обработка АВЛ-деревьев. Операции вставки, удаления- демонстрация.
Анализ условия:
Наибольший интерес представляет само создание дерева.
По определению: АВЛ дерево-это дерево, разность высот поддеревьев которого не более 1.
Элементы в дереве записаны по возрастанию (либо по убыванию) при обходе справа налево. Это значительно облегчает поиск по дереву.
Итак, предложим алгоритм вставки элемента:
-
Надо найти место элемента в дереве. Для чего становимся на корень, и если значение корня больше значения нового элемента, то шаг в левое поддерево, если нет, то в правое.
-
Если на каком-то шаге оказалось, что данный элемент уже существует, то выход из алгоритма.
-
Когда место найдено, производится вставка элемента как листа.
При этом может возникнуть следующая проблема: Дерево потеряет балансировку. Для этого разработаны две процедуры: ReverseR и ReverseL- вращения дерева вправо и влево соответственно.
Существует теорема, утверждающая, что в любом случае таких вращений при вставке понадобиться не боле двух.
Операция удаления всегда связана с поиском по дереву, так как нужный элемент всегда сначала нужно найти.
Более того: что делать с двумя поддеревьями этого элемента?
В данном случае используется операция вращения, пока одно из поддеревьев не будет пустым. Затем производится удаление и обратная операция.
Разработка структур данных:
Дерево в программе хранится в виде карты. Например:
Дерево: В программе:
№ 1 2 3 4 5
5 val: 5 6 3 1 4
3 6 r: 2 0 5 0 0
1 4 l: 3 0 4 0 0
Hr: 1 0 1 0 0
Hl: 2 0 1 0 0
F: 0 1 1 2 2
Такой вид записи облегчает поиск по дереву, и саму операцию удаления.
Но при вставке необходим обратный ход от последнего элемента до корня с целью увеличения значений высот поддеревьев.
Так же вместе с картой хранится число элементов дерева.
Сценарий диалога с пользователем:
Рабочее окно выглядит следующим образом:
Основные операции вынесены на форму, а так же дублируются в главном меню окна.
При обращении к любой из операций вид дерева автоматически отображается в левой части окна.
Клавиша “Print”-нарисовать дерево, оставлена для совместимости.
Вместе с тем предусмотрены операции «Ввести из Файла»- ввод дерева из указанного файла. И «Ввести вручную»- ввод сразу нескольких узлов.
Хотя дерево можно задать и путем поэлементной вставки, но если дерево большое, то удобнее вводить по несколько элементов сразу.
Вывод:
АВЛ деревья- одни из наиболее пригодных деревьев с точки зрения поиска элемента. Хотя они и не так «низки» как идеально- взбалансированные, но строятся быстрее и легче.
Тест:
Начальное Дерево операция Результат
4 вставка 7 4
-
5 2 5
1 3 1 3 7
6 вставка 5 3
-
7 2 6
1 3 1 5 7
4 удаление 4 2
-
7 1 7
1 3 3
4 удаление 2 4
-
7 3 7
1 3 1