Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦИИ Программирование и основы алгоритмизации...doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
1.5 Mб
Скачать

Реализация дерева с помощью массивов

Способ реализации динамических структур с помощью массивов позволяет сортировать структуры из громоздких элементов данных без их физического перемещения в памяти и при этом не расходовать время на выделение и освобождение памяти для каждого элемента данных.

Вывод динамических структур в файл и чтение их из файла

Вывод в файл производится без вывода адресов; выводятся только данные. При чтении из файла одновременно формируется соответствующая динамическая структура данных.

Сбалансированные (avl) деревья

Бинарные деревья поиска предназначены для быстрого доступа к данным. В идеале дерево является разумно сбалансированным и имеет высоту порядка . Однако при некоторых данных дерево может оказаться вырожденным. Например, отсортированный по возрастанию массив 1, 2, 3, 4, 5 представлен деревом:

Высота дерева равна 4; в общем случае - . Доступ к данным существенно замедлится, эффективность поиска – эквивалентна списку.

AVL-деревья обладают всеми преимуществами бинарных деревьев и никогда не вырождаются. Под их сбалансированностью понимают то, что для каждого узла дерева высоты обоих его поддеревьев различаются не более чем на 1. В данном случае AVL-дерево имеет вид:

Высота дерева равна 2.

Для неотсортированного массива 20, 30, 80, 40, 10, 60, 50, 70 бинарное дерево (высота дерева равна 5):

AVL-дерево (высота дерева равна 3) :

В общем случае высота сбалансированного дерева не превышает . Поэтому AVL-дерево является мощной структурой хранения, обеспечивающей быстрый доступ к данным.

Особенностью AVL-дерева является то, что при вставке новых узлов и удалении узлов нужно постоянно отслеживать соотношение высот левого и правого поддеревьев узла. Для сохранения этой информации в структуру узла нужно включать показатель сбалансированности, который содержит разность высот правого и левого поддеревьев.

Примеры:

Следовательно:

-1: высота левого поддерева на 1 больше высоты правого поддерева,

0: высоты обоих поддеревьев одинаковы,

+1: высота правого поддерева на 1 больше высоты левого поддерева.

AVL-дерево должно оставаться сбалансированным по высоте после каждой операции включения или удаления узла.

Алгоритм avl-вставки.

Включение узла в AVL-дерево происходит почти так же, как и в бинарное дерево.

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

После пробного включения обработка узлов ведется в обратном порядке. При этом корректируется показатель сбалансированности корневого узла и всех остальных узлов, входящих в путь поиска. Необходимость обработки в обратном порядке требует, чтобы процесс был рекурсивным. При этом возможны три случая.

1-й случай

Узел (корень) изначально сбалансирован (показатель сбалансированности равен 0). После включения в поддерево нового узла корень станет перевешивать влево или вправо в зависимости от того, в какое поддерево было сделано включение. Если в левое, то показателю сбалансированности узла присваивается -1, если в правое - +1.В этом случае дерево сохраняет сбалансированность, пробное включение сохраняется.

2-й случай

Одно из поддеревьев перевешивает, и новый узел включается в более легкое поддерево

Корень становится полностью сбалансированным. Пробное включение сохраняется.

3-й случай

Одно из поддеревьев корня перевешивает, и новый узел включается в более тяжелое поддерево. При этом нарушается условие сбалансированности. Чтобы восстановить равновесие, нужен поворот.

Если дерево разбалансировалось слева, то для восстановления равновесия нужен поворот вправо. Если же справа, то симметричные действия – поворот влево.