Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> tree 
:(
    Опции темы
_Ghost_
Дата 6.12.2010, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 24.12.2007

Репутация: нет
Всего: нет



Добрый день.
есть класс 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__


создать дрьево, добавить узлы ,удалить узлы, переместить узлы, ...
PM MAIL   Вверх
Metalex
Дата 9.12.2010, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



Здесь все ясно написано.


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0775 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.