Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка3.2.doc
Скачиваний:
37
Добавлен:
19.08.2019
Размер:
3.14 Mб
Скачать

Лабораторная работа № 4 сбалансированные деревья. Пирамида.

Цель работы: изучить структуру данных бинарных деревьев поиска, разработать класс TFindTree для работы с ней и получить практический навык его использования.

Теоретические сведения

Пирамида (Heap) – это структура данных, представленная в виде бинарного дерева, значения родительских узлов в котором меньше или равны, значению любого из наследников.

В пирамидах существуют два вида упорядочения:

  1. По возрастанию.

  2. По убыванию.

При упорядочении по возрастанию значение родительского узла меньше или равно любому из его наследников (рис. 1).

При упорядочении по убыванию значение родительского узла больше или равно любому из его наследников (рис. 2).

Рис. 1. Пирамида, упорядоченная по возрастанию

Рис. 2. Пирамида, упорядоченная по убыванию

Пирамиду эффективней всего представить в виде одномерного массива, узлы которого имеют последовательную индексацию.

Рис. 3. Структура массива

Рис. 4. Структура массив

Для представления пирамиды в виде дерева, необходимо знать, как родительский узел связан с наследниками и как наследники связаны с родительским узлом.

Пусть i – номер родительского узла, тогда левый сын будет иметь индекс в массиве 2i+1, а правый – 2i+2. Индекс левого сына будет всегда нечетным, а правого – четным.

Пусть i – порядковый номер дочернего узла, тогда номер родительского узла можно найти по формуле: ( .

Для левого сына всегда будет получаться целое число, а для правого сына значение необходимо округлить до наименьшего целого.

В языке C++ не нужно округлять до наименьшего целого. Это происходит автоматически при выполнении целочисленного деления.

В пирамиде используют две операции: вставка и удаление.

  1. Операция вставки

Вставка очередного узла всегда осуществляется в конец пирамиды.

После этого может произойти изменение структуры «пирамида», поэтому необходимо сравнить значение вставляемого узла с родительским узлом. Если значение данного узла меньше (больше) родительского, то вставляемый узел меняют с родительским узлом местами. И т.д. поднимаясь вверх по структуре «дерево».

Данная операция рассматривается отдельно, как перемещение узла вверх до тех пор, пока не будет достигнут корень дерева или не будет найдено правильное место узла в его структуре.

  1. Операция удаления

Операция удаления выполняется только для корня дерева, в котором будет всегда находиться минимальный (максимальный) элемент. После удаления корня, на его место помещают последний элемент в структуре «пирамида».

Однако при этом может нарушиться структура пирамиды. Поэтому вставленный узел сравнивается с его наследниками. Если он больше (меньше) любого из наследников, то он перемещается вместо наименьшего из них. Данная операция повторяется для всех остальных узлов и называется перемещением узла вниз. Она выполняется до тех пор, пока не будет достигнут конец дерева или пока не будет найдено место для вставки.

Пирамида является одним из самых эффективных и устойчивым методом сортировки элементов. Она является основой очередей приоритетов и используется в БД в качестве индексов.

ADT – формат класса THeap

ADT TTreeNode

Поля

Указатель на родительский узел (FParent): Тип узла

Данные узла (FData): Заданный тип

Уровень узла (FLevel): Целый тип

Список дочерних узлов (Items): Динамический массив узлов vector

Счетчик узлов (FCount): Целый тип

Методы

Конструктор

Вход: Родительский узел и данных нового узла

Предусловие: Нет

Начальные значения: Нет

Процесс: Инициализация полей объекта

Добавление дочернего узла (AddChild)

Вход: Данные дочернего узла

Предусловие: Нет

Процесс: Создание нового узла и добавление его в конец списка узлов

Постусловие: Новый элемент добавлен в конец списка и счетчик узлов увеличен на единицу.

Выход: Указатель на созданный узел

Вставка дочернего узла в указанную позицию (InsetChild)

Вход: Родительский узел, порядковый номер в списке родителя и данные нового узла.

Предусловие: Порядковый номер узла меньше количества узлов и не меньше нуля.

Процесс: Создание нового узла и добавление его в указанную позицию списка дочерних узлов.

Постусловие: Новый элемент добавлен в указанную позицию списка, и счетчик узлов увеличен на единицу.

Выход: Указатель на созданный узел

Удаление дочернего узла (DeleteChild)

Вход: Индекс узла в списке родителя

Предусловие: Порядковый номер узла меньше количества узлов и не меньше нуля.

Процесс: Удаление узла из списка родителя и упорядочивание в нем оставшихся элементов.

Постусловие: Счетчик узлов и длина дочернего списка уменьшены на единицу.

Выход: Нет

Деструктор (Destroy)

Вход: Нет

Предусловие: Нет

Процесс: Удаление из памяти всех дочерних узлов из списка.

Конец ADT TTreeNode