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