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

Синтаксис объявления класса 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