Advertisement
VictoriaLodochkina

lab 6

Nov 19th, 2020
680
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.32 KB | None | 0 0
  1. #pragma once
  2. using namespace std;
  3.  
  4. class ExTree {
  5. public:
  6.     string problem;
  7.     ExTree(string str):problem(str) {};
  8. };
  9.  
  10.  
  11. template <class T>
  12. class SearchTree
  13. {
  14. public:
  15.     T data;                                   //ключ типа Т
  16.     SearchTree* left;                         //указатель на левого потомка
  17.     SearchTree* right;                        //указатель на правого потомка
  18.     SearchTree* parent;                       //указатель на родителя
  19.     SearchTree(T);                            //конструктор
  20.     ~SearchTree();                            //деструктор
  21.     void deleteSearchTree() { delete this; }  //удалить дерево
  22.     void printSearchTree(int);                //горизонтальная печать дерева
  23.     void inOrder(SearchTree<T>*);             //симметричный обход дерева
  24.     void setData(T dt) { data = dt; }         //установить данные для узла
  25.     SearchTree<T>* next();                    //найти следующий элемент
  26.     SearchTree<T>* prev();                    //найти предыдущий элемент
  27.     void insertNode(T);                       //добавить узел
  28.     void deleteNode(T);                       //удалить узел
  29.     SearchTree<T>* findElement(T);            //найти элемент
  30.     SearchTree<T>* findMax();                 //найти максимальный элемент
  31.     SearchTree<T>* findMin();                 //найти минимальный элемент
  32.  
  33.     void treeprint(SearchTree<T>*);           //печать
  34.     SearchTree() {};
  35. };
  36.  
  37. template <class T>//мой код
  38. SearchTree<T>::SearchTree(T val)
  39. {
  40.     //parent->data = val;
  41.     //parent=nullptr;
  42.     /*if (parent == nullptr)
  43.     {
  44.         left = nullptr;
  45.         right = nullptr;
  46.         return;
  47.     }
  48.     parent->data = val;*/
  49.     parent = this;
  50.     parent->data = val;
  51.  
  52. }
  53.  
  54. template <class T>//мой код
  55. SearchTree<T>::~SearchTree()
  56. {
  57.     deleteSearchTree();
  58. }
  59.  
  60. template <class T>
  61. SearchTree<T>* SearchTree<T>::findElement(T data)
  62. {
  63.     if ((this == NULL) || (data == this->data))//если ключ узла равен NULL или совпал с      
  64.         return this;                           //заданным ключом, то функция завершается,
  65.                                                //возвращая заданный узел дерева
  66.     if (data < this->data)
  67.         return this->left->findElement(data);  //если заданный ключ меньше текущего
  68.                                                //ключа, то функция вызывается рекурсивно,
  69.                                                //но уже для левого поддерева заданного
  70.     else return this->right->findElement(data);//узла, в противном случае элемент ищется
  71.                                                //в правом поддереве заданного узла,
  72. }  //до срабатывания начального if
  73.  
  74. template <class T>
  75. SearchTree<T>* SearchTree<T>::findMin()     //поиск минимального элемента
  76. {
  77.     if (this->left == NULL) return this; //если указатель на узел слева равен NULL,
  78.                                             //значит текущий элемент является минимальным
  79.     return this->left->findMin();        //иначе рекурсивно вызывая функцию,  
  80.                                          //двигаемся по левым поддеревьям до тех пор,
  81.                                          //пока указатель на узел слева не равен NULL
  82. }
  83.  
  84. template <class T>
  85. SearchTree<T>* SearchTree<T>::findMax()     //поиск максимального элемента
  86. {
  87.     if (this->right == NULL) return this;//если указатель на узел справа равен NULL,
  88.                                             //значит текущий элемент является максимальн.
  89.     return this->right->findMax();       //двигаемся по правым  поддеревьям до тех
  90.                                       //пор, пока указатель на узел справа
  91.                                             //не станет равным NULL
  92. }
  93.  
  94. template <class T>
  95. SearchTree<T>* SearchTree<T>::next()     //поиск следующего элемента
  96. {
  97.     SearchTree* tree = this;          //заданный узел запоминается во вспомогательный,
  98.                                          //чтобы не перемещать его при поиске  
  99.     if (tree->right != NULL)          //если правое поддерево заданного узла сущ.,
  100.         return tree->right->findMin();//то ищется минимальный элемент в этом
  101.                         //правом поддереве (он и будет следующим
  102.                                          //для заданного)
  103.     SearchTree<T>* t = tree->parent;  //в противном случае, нужно двигаться
  104.                                          //вверх до тех пор,
  105.                                          //пока не встретится узел, для которого заданный
  106.                                          //является левым дочерним узлом
  107.     while ((t != NULL) && (tree == t->right))//пока узел является правым дочерним для своего
  108.                              //родителя и родитель существует, выполняем цикл
  109.     {
  110.         tree = t;                   //запоминаем текущий узел
  111.         t = t->parent;              //переходим к его родителю
  112.     }
  113.     return t;
  114. }
  115.  
  116. template <class T>
  117. SearchTree<T>* SearchTree<T>::prev()     //поиск предыдущего элемента
  118. {
  119.     SearchTree* tree = this;
  120.     if (tree->left != NULL)
  121.         return tree->left->findMax();
  122.     SearchTree<T>* t = tree->parent;
  123.     while ((t != NULL) && (tree == t->left))
  124.     {
  125.         tree = t;
  126.         t = t->parent;
  127.     }
  128.     return t;
  129. }
  130.  
  131. template <class T>
  132. void SearchTree<T>::insertNode(T dt)
  133. {
  134.     SearchTree<T>* tree = this;
  135.     //
  136.     if(tree->findElement(dt)!=0)
  137.     {
  138.         throw ExTree("This value is existed already.");
  139.     }
  140.     //
  141.     while (tree != NULL)               //пока узел существует выполняется цикл
  142.     {                                  //если ключ добавляемого элемента
  143.         if (dt >= tree->data)       //больше или равен ключу    
  144.         {                           //текущего узла, анализируется правое поддерево
  145.             if (tree->right != NULL)  //если узел справа существует, происходит    
  146.             {                        //переход к нему и выполнение
  147.                 tree = tree->right;//цикла начинается сначала
  148.             }
  149.             else                   //иначе добавляем новый элемент в узел                                    
  150.             {                      //справа, настроив все необходимые указатели
  151.                 SearchTree<T>* t = new SearchTree<T>(dt);//для нового элемента
  152.                 t->parent = tree;
  153.                 tree->right = t;
  154.                 break;
  155.             }
  156.         }
  157.         else if (dt < tree->data)     //если ключ добавляемого элемента меньше                                      
  158.         {                             //ключа текущего узла, анализируется
  159.                                             //левое поддерево
  160.             if (tree->left != NULL) //если узел слева существует, происходит  
  161.             {                      //переход к нему и выполнение цикла начинается
  162.                 tree = tree->left;// сначала
  163.             }
  164.             else                                        //иначе добавляется новый                                
  165.             {                                              //элемент в узел слева,                    
  166.                 SearchTree<T>* t = new SearchTree<T>(dt);//настраиваются все  
  167.                 t->parent = tree;                      //необходимые указатели                        
  168.                 tree->left = t;                        //для нового элемента
  169.                 break;
  170.             }
  171.         }
  172.     }
  173. }
  174.  
  175. template <class T>
  176. void SearchTree<T>::treeprint(SearchTree<T>* p) {
  177.     if (p != NULL) {
  178.         treeprint(p->left);
  179.         cout <<p->data << endl;
  180.         treeprint(p->right);
  181.     }
  182. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement