- •Лабораторная работа № 1 структура данных дерево
- •Теоретические сведения
- •Синтаксис объявления класса tTreeNode
- •Синтаксис объявления класса tTree
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 2 бинарные деревья
- •Теоретические сведения
- •Синтаксис объявления класса tBinTreeNode
- •Синтаксис объявления класса tBinTree
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 3 бинарные деревья поиска
- •Теоретические сведения
- •Синтаксис объявления класса tFindTreeNode
- •Синтаксис объявления класса tFindTree
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 4 сбалансированные деревья. Пирамида.
- •Теоретические сведения
- •Синтаксис объявления класса tHeap
- •Пирамидальная сортировка
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 5 алгоритмы сортировки данных
- •Теоретические сведения
- •Алгоритмы внутренней сортировки
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 6 структура данных граф
- •Теоретические сведения
- •Программа работы
- •Контрольные вопросы
- •Библиографический список
- •Содержание
Синтаксис объявления класса tTreeNode
template <class T>
class TTree;
template <class T>
class TTreeNode
{
private:
TTreeNode<T>* FParent;
T FData;
int FLevel;
vector<TTreeNode<T>*> Items;
int FCount;
TTreeNode(TTreeNode<T>* Parent, T Data);
TTreeNode<T>* AddChild(T Data);
TTreeNode<T>* InsertChild(int Index, T Data);
void DeleteChild(int Index);
~TTreeNode();
friend class TTree<T>;
};
Класс TTreeNode содержит поля FParent для хранения указателя на родительский узел, список дочерних узлов Items и количество FCount, уровень узла дерева FLevel и его данные FData. Конструктор присваивает новые данные узлу, включая родителя, а методы AddChild, InsertChild, DeleteChild добавляют, вставляют и удаляют дочерние узлы. Деструктор класса не только освобождает память от самого объекта, но и удаляет все его дочерние узлы.
В модуле с данным классом можно определить класс исключительных ситуаций EQueueError для обработки ошибок, которые могут возникать при работе с узлами дерева.
#define ETreeNodeError Exception
Чтобы использовать эти классы, в заголовочном разделе модуля с расширением h необходимо подключить модуль SysUtils.hpp, в котором хранить базовый класс исключительных ситуаций Exception.
После объявления класса TTreeNode необходимо определить все его методы в заголовочном разделе модуля с расширением h в соответствии с ADT – форматом.
После объявления класса необходимо определить все его методы в разделе implementation в соответствии с ADT – форматом.
template <class T>
TTreeNode<T>::TTreeNode(TTreeNode<T>* Parent, T Data)
{
FData = Data;
FParent = Parent;
if (Parent == NULL)
FLevel = 0;
else
FLevel = Parent->FLevel+1;
FCount = 0;
}
template <class T>
TTreeNode<T>* TTreeNode<T>::AddChild(T Data)
{
TTreeNode<T>* NewNode;
NewNode = new TTreeNode<T>(this, Data);
Items.push_back(NewNode);
FCount++;
return NewNode;
}
template <class T>
TTreeNode<T>* TTreeNode<T>::InsertChild(int Index, T Data)
{
if ((Index < 0) && (Index >= FCount))
throw ETreeNodeError("Неправильный номер элемента");
TTreeNode<T>* NewNode = AddChild(Data);
for (int i = FCount - 1; i > Index ; i--)
Items[i] = Items[i-1];
Items[Index] = NewNode;
}
template <class T>
void TTreeNode<T>::DeleteChild(int Index)
{
if ((Index < 0) && (Index >= FCount))
throw ETreeNodeError("Неправильный номер элемента");
delete Items[Index];
for (int i = Index; i < FCount - 1; i++)
Items[i] = Items[i+1];
Items.pop_back();
FCount--;
};
template <class T>
TTreeNode<T>::~TTreeNode()
{
for (int i = 0; i < FCount; i++)
delete Items[i];
}
ADT – формат класса TTree
ADT TTree
Поля
Корень дерева (Root): Указатель на класс TTreeNode
Методы
Конструктор
Вход: Родительский узел и данных нового узла
Предусловие: Нет
Начальные значения: Нет
Процесс: Инициализация полей объекта
Добавление узла (Add)
Вход: Указатель на узел и данные нового узла
Предусловие: Если узел равен NULL, то корня дерева не должно быть
Процесс: Создание нового узла и добавление его в конец дочернего списка родителя переданного узла. Если переданный узел равен NULL и корня не существует, то узел становится корнем дерева.
Постусловие: Новый узел добавлен в конец списка родителя переданного узла или становится корнем дерева.
Выход: Указатель на созданный узел
Вставка узла (Insert)
Вход: Указатель на узел, порядковый номер для вставки и данные нового узла
Предусловие: Узел не корень дерева и если узел равен NULL, то корня дерева не должно быть
Процесс: Создание нового узла и добавление его в указанную позицию дочернего списка родителя переданного узла. Если переданный узел равен NULL и корня не существует, то узел становится корнем дерева.
Постусловие: Новый узел добавлен в указанную позицию списка родителя переданного узла или становится корнем дерева.
Выход: Указатель на созданный узел
Удаление узла (Delete)
Вход: Указатель на узел и порядковый номер для удаления
Предусловие: Узел не равен NULL
Процесс: Удаление узла с переданным порядковым номером из дочернего списка родителя переданного узла. Если переданный узел является корнем дерева, то после удаления корень дерева устанавливается в NULL.
Постусловие: Узел удален из списка родителя переданного узла или удален корень дерева
Выход: Нет
Добавление узла (AddChild)
Вход: Указатель на узел и данные нового узла
Предусловие: Если узел равен NULL, то корня дерева не должно быть
Процесс: Создание нового узла и добавление его в конец дочернего списка переданного узла. Если переданный узел равен NULL и корня не существует, то узел становится корнем дерева.
Постусловие: Новый узел добавлен в конец списка переданного узла или становится корнем дерева.
Выход: Указатель на созданный узел
Вставка узла (InsertChild)
Вход: Указатель на узел, порядковый номер для вставки и данные нового узла
Предусловие: Если узел равен NULL, то корня дерева не должно быть
Процесс: Создание нового узла и добавление его в указанную позицию дочернего списка переданного узла. Если переданный узел равен NULL и корня не существует, то узел становится корнем дерева.
Постусловие: Новый узел добавлен в указанную позицию дочернего списка переданного узла или становится корнем дерева.
Выход: Указатель на созданный узел
Удаление узла (DeleteChild)
Вход: Указатель на узел и порядковый номер для удаления
Предусловие: Узел не равен NULL
Процесс: Удаление узла с переданным порядковым номером из дочернего списка переданного узла.
Постусловие: Узел удален из списка родителя переданного узла
Выход: Нет
Очистка дерева (Clear)
Вход: Нет
Предусловие: Нет
Процесс: Удаление всех узлов, начиная с корня дерева, и установка корня дерева в NULL
Постусловие: Все узлы дерева удалены, и корень установлен в NULL
Выход: Нет
Деструктор
Вход: Нет
Предусловие: Нет
Процесс: Удаление из памяти всех узлов, начиная с корня дерева.
Конец ADT TTree