Добрый день. есть класс CTree. помогите пожалуйста понять как исползовать этот класс. т.е. как создать дерево как добовлять,удалвть и все методы класса. Код | #if !defined __CTREE__INCLUDED__ #define __CTREE__INCLUDED__ #include <cstdio> #include <iostream> #include <vector> template <typename T> struct STreeNode { //! ветки дерева std::vector<STreeNode<T> *> ChildNodes; //!ветки дерева STreeNode * BackNode; //! предеыдыший узел T data; //! данные на ткушей позиции (операция либо значене х) //!вес точки дерева //!уникальное число точки древа // данное число будет генерироватся от 0 до количеста узлов в дереве с шагом 1 //! по этому весу можно будет добратся с помошью метода MoveToNode int weight; }; static int cur_w = -1; static int am_w = 0; // класс дерево //! first - первоая опорная точка дерева всегда содержит в себе начало дерева //! node - всегда текуший ызел дерева но не первый узел дерева template <typename T> class CTree { typedef STreeNode<T> * st_node; private: //! узлы дерева st_node node; //! дерево //! стартовая часть древа ,самая верхняя точка дерева st_node first; //! 1 = пустой;, 0 = непустой int is_empty; //! Выгручить дерево из памяти void Clear(STreeNode<T> * n); //! текушяя глуина int cur_depth; public: CTree(); ~CTree(); void Destroy(); void ForceDestroy(); //функция создает самый первый узел ,эта функция должна вызыватся самой первой void CreateMainNode(T data); void push_node(T data); //добавить ответвление от текушей точки void push_node(STreeNode<T> *&n, T data); перемешает теку. курсор на данный узел //! n - откуда искать //! r - результат //! num_node - с каким весом искать void MoveToNode(STreeNode<T> *n, STreeNode<T> *&r,int num_node); //! перемешает на текуший узел void MoveToNode(int num_node); функция возвр. количество весов в дереве int getAmountWeights() { ClearGeneratorWeights(); GenerateWeights(first, 0); return am_w; } функция должна вызывать после окончателного создания дерева гля установки его весов если эта функция не будет вызванна то в генерическом классе произаидет ошибка в вычисление void GenerateWeights(STreeNode<T> *n, int cur_weight); //! очистиь генератор весов //! должен вызуватся перед функцией void GenerateWeights(STreeNode<T> *n, int cur_weight); void ClearGeneratorWeights(); функция возврошает ветку дерева исходя из текушей позиции //! flag параметр устанавливает какую ветку необходимо возвратит правую или левую // STreeNode<T> * getBranch(branch_type &flag); //! поменять две ветки местами void ChangeBranch(STreeNode<T> *&n1, STreeNode<T> *&n2); void Display(STreeNode<T> *n); void SelfDisplay(); копирует алготитм из дерева в текстовый массив void getAlgFromTree(STreeNode<T> *n, std::vector<T> &arr); //! шаг назат void StepBack(); bool Empty(){return is_empty;} возврошает указатель на текишую позицию дерева STreeNode<T> * &getCurentNode(){return node;} STreeNode<T> * getFirstNode()const{return first;} //! возврошает количество веток у текушего узла int getAmountBranch()const{return node->ChildNodes.size();} int getCurentDepth()const{return cur_depth;} void ToBegin(){node = first; cur_depth = 1;} }; template <typename T> CTree<T>::CTree(void): node(0), is_empty(1), cur_depth(0) { }//! end of Constructor //! удалить template <typename T> void CTree<T>::Clear(STreeNode<T> * n) { if(!n) return; if(n->ChildNodes.size() != 0) { std::vector<STreeNode<T> *>::iterator It_Node = n->ChildNodes.begin(); while(It_Node != n->ChildNodes.end()) { Clear(*It_Node); ++It_Node; }//! end of while }//! end of if printf("\nNode of tree is removed... id node: %c, number of segment node: %d", n->data, n->weight); delete n; n = 0; am_w = 0; cur_w = -1; } //! удалить упрошенны вариант template <typename T> void CTree<T>::Destroy() { this->Clear(this->first); is_empty = 1; cur_depth = 0; } //! удалить template <typename T> void CTree<T>::ForceDestroy() { is_empty = 0; this->Clear(this->first); is_empty = 1; cur_depth = 0; } template <typename T> void CTree<T>::CreateMainNode(T data) { if(!is_empty) { printf("Error: A tree is already created!!!"); return; }//! end of if is_empty = false; //! дерево не пустое STreeNode<T> * new_node = new STreeNode<T>();//! делаем нулевой узел new_node->data = data; new_node->BackNode = 0; new_node->weight = 0; first = node = new_node; ++cur_depth; } template <typename T> void CTree<T>::GenerateWeights(STreeNode<T> *n, int cur_weight) { if(!n) return; cur_w += 1; am_w += 1; n->weight = cur_w; if(n->ChildNodes.size() != 0) { std::vector<STreeNode<T> *>::iterator It_Node = n->ChildNodes.begin(); while(It_Node != n->ChildNodes.end()) { GenerateWeights(*It_Node, cur_weight); ++It_Node; }//! end of while }//! end of if } template <typename T> void CTree<T>::ClearGeneratorWeights() { cur_w = -1; am_w = 0; } template <typename T> void CTree<T>::MoveToNode(STreeNode<T> *n, STreeNode<T> *&r,int num_node) { if(!n) return; if(n->weight == num_node) { r = n; return; }//! end of if if(n->ChildNodes.size() != 0) { std::vector<STreeNode<T> *>::iterator It_Node = n->ChildNodes.begin(); while(It_Node != n->ChildNodes.end()) { MoveToNode(*It_Node, r, num_node); ++It_Node; }//! end of while }//! end of if } template <typename T> void CTree<T>::MoveToNode(int num_node) { MoveToNode(first, node, num_node); } //! добавить узел template <typename T> void CTree<T>::push_node(STreeNode<T> *&n, T data) { if(is_empty) { printf("Error: A tree is not created!!!"); return; }//! end of if STreeNode<T> * new_node = new STreeNode<T>();//! делаем новый узел new_node->data = data; new_node->BackNode = this->node; new_node->weight = 0; n->ChildNodes.push_back(new_node); this->node = new_node; ++cur_depth; } template <typename T> void CTree<T>::push_node(T data) { this->push_node(node, data); } template <typename T> void CTree<T>::ChangeBranch(STreeNode<T> *&n1, STreeNode<T> *&n2) { try { STreeNode<T> *temp = new STreeNode<T>(); temp->ChildNodes = n1->ChildNodes; temp->data = n1->data; temp->weight = n1->weight; n1->ChildNodes = n2->ChildNodes; n1->data = n2->data; n1->weight = n2->weight; n2->ChildNodes = temp->ChildNodes; n2->data = temp->data; n2->weight = temp->weight; this->ClearGeneratorWeights(); this->GenerateWeights(n1, 0); this->ClearGeneratorWeights(); this->GenerateWeights(n2, 0); } catch(...) { cout << "Error in ChangeBranch(!)"; return; } } template <typename T> void CTree<T>::Display(STreeNode<T> *n) { if(!n) return; std::cout << n->data << " "; if(n->ChildNodes.size() != 0) { std::vector<STreeNode<T> *>::iterator It_Node = n->ChildNodes.begin(); while(It_Node != n->ChildNodes.end()) { Display(*It_Node); ++It_Node; }//! end of while }//! end of if } template <typename T> void CTree<T>::SelfDisplay() { Display(first); } template <typename T> void CTree<T>::getAlgFromTree(STreeNode<T> *n, std::vector<T> &arr) { if(!n) return; arr.push_back(n->data); if(n->ChildNodes.size() != 0) { std::vector<STreeNode<T> *>::iterator It_Node = n->ChildNodes.begin(); while(It_Node != n->ChildNodes.end()) { getAlgFromTree(*It_Node, arr); ++It_Node; }//! end of while }//! end of if } template <typename T> void CTree<T>::StepBack() { if(node->BackNode) { node = node->BackNode; --cur_depth; }//! end of if } template <typename T> CTree<T>::~CTree(void) { Destroy(); }//! end of Destructor #endif //! end of __CTREE__INCLUDED__
|
создать дрьево, добавить узлы ,удалить узлы, переместить узлы, ...
|