Advertisement
spacerose

дерево черновик старый

Oct 9th, 2020
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.17 KB | None | 0 0
  1.  
  2. #include <iostream>
  3. #include <Windows.h>
  4. #include <conio.h>
  5. #include <cmath>
  6. using namespace std;
  7. struct BinTree {
  8.     int value; //содержит значение
  9.     BinTree* left;//адрес левого поддерева
  10.     BinTree* right;//адрес правого поддерева
  11. };
  12.  
  13.  
  14. /*
  15.  * Inserting Element into the Tree
  16.  */
  17. /*
  18. void newBinTree(int val, BinTree** Tree, BinTree* newnode)
  19. {
  20.     if (root == NULL)
  21.     {
  22.         root = new BinTree;
  23.         root->value = newnode->value;
  24.         root->left = NULL;
  25.         root->right = NULL;
  26.         cout << "Root Node is Added" << endl;
  27.         return;
  28.     }
  29.    
  30.     if ((*Tree)->value > newnode->value)
  31.     {
  32.         if ((*Tree)->left != NULL)
  33.         {
  34.             newBinTree((*Tree)->value,(*Tree)->left, newnode);
  35.         }
  36.         else
  37.         {
  38.             (*Tree)->left = newnode;
  39.             ((*Tree)->left)->left = NULL;
  40.             (tree->left)->right = NULL;
  41.             cout << "Node Added To Left" << endl;
  42.             return;
  43.         }
  44.     }
  45.     else
  46.     {
  47.         if ((*Tree)->right != NULL)
  48.         {
  49.             insert(tree->right, newnode);
  50.         }
  51.         else
  52.         {
  53.             tree->right = newnode;
  54.             (tree->right)->left = NULL;
  55.             (tree->right)->right = NULL;
  56.             cout << "Node Added To Right" << endl;
  57.             return;
  58.         }
  59.     }
  60. }
  61. */
  62. //Функция для создания дерева
  63. //Вход: значение будущего узла,узел бинарного дерева
  64. //Выход: упорядоченое бинарное деревоб,заполеное значениями
  65. void newBinTree(int val, BinTree** Tree) {
  66.  
  67. /*
  68.     TNode** cur = &Root;
  69.     while (*cur) {
  70.         TNode& node = **cur;
  71.         if (x < node.Key) {
  72.             cur = &node.Left;
  73.         }
  74.         else if (x > node.Key) {
  75.             cur = &node.Right;
  76.         }
  77.         else {
  78.             return;
  79.         }
  80.     }
  81.     *cur = new TNode(x);
  82.     */
  83.  
  84.     if ((*Tree) == NULL)
  85.     {
  86.         (*Tree) = new BinTree; //Выделить память
  87.         (*Tree)->value = val;  //Поместить в выделенное место аргумент
  88.         (*Tree)->left = (*Tree)->right = NULL;
  89.         return;
  90.     }
  91.     if (val > (*Tree)->value) newBinTree(val, &(*Tree)->right); //Если аргумент больше чем текущий элемент, поместить его вправо
  92.     else newBinTree(val, &(*Tree)->left);//Иначе поместить его влево
  93.   }
  94.  
  95.  
  96.  
  97. //Для печати дерева
  98. void Print(BinTree** Tree, int l)
  99. {
  100.     int i;
  101.  
  102.     if (*Tree != NULL)
  103.     {
  104.         Print(&((**Tree).right), l + 1);
  105.         for (i = 1; i <= l; i++) cout << "   ";
  106.         cout << (**Tree).value << endl;
  107.         Print(&((**Tree).left), l + 1);
  108.     }
  109. }
  110.  
  111. void TreeTraversalAndPrint(BinTree* Root) {
  112.     if (Root != NULL) {
  113.         cout << Root->value << endl;
  114.         TreeTraversalAndPrint(Root->left);
  115.         TreeTraversalAndPrint(Root->right);
  116.  
  117.     }
  118. }
  119.  
  120. void TreeTraversalAndPrint2(BinTree* Root) {
  121.     if (Root != NULL) {
  122.         TreeTraversalAndPrint2(Root->left);
  123.         TreeTraversalAndPrint2(Root->right);
  124.         cout << Root->value << endl;
  125.     }
  126. }
  127. void TreeTraversalAndPrint3(BinTree* Root) {
  128.     if (Root != NULL) {
  129.         TreeTraversalAndPrint2(Root->left);
  130.         cout << Root->value << endl;
  131.         TreeTraversalAndPrint2(Root->right);
  132.     }
  133. }
  134. //Так как в бинарном дереве поиска для каждого узла справедливо, что left < right,
  135. //то соответственно для нахождения наименьшенго элемента
  136. //надо топать от корня по левым веткам до упора - там и будет наименьший.
  137. BinTree* MinValue(BinTree* Tree)
  138. {
  139.     if (Tree->left != NULL) {
  140.         return MinValue(Tree->left);
  141.     }
  142.     else {
  143.         return Tree;
  144.     }
  145. }
  146. //Так как в бинарном дереве поиска для каждого узла справедливо, что left < right,
  147. //то соответственно для нахождения наибольшего элемента
  148. //надо топать от корня по правым веткам до упора - там и будет наибольший.
  149. BinTree* MaxValue(BinTree* Tree)
  150. {
  151.     if (Tree->right != NULL) {
  152.         return  MaxValue(Tree->right);
  153.     }
  154.     else {
  155.         return Tree;
  156.     }
  157. }
  158. int NumberOfNodes(BinTree* Tree) {
  159.     if (Tree == NULL) return 0;
  160.     return NumberOfNodes(Tree->left) + 1 + NumberOfNodes(Tree->right);
  161. }
  162.  
  163. int ListCount(BinTree* node)
  164. {
  165.     if (!node)
  166.         return 0;
  167.     if (!node->left && !node->right)
  168.         return 1;
  169.     return  ListCount(node->left) + ListCount(node->right);
  170. }
  171.  
  172. //Высота(максимальная глубина) дерева определяется количеством уровней,
  173. //на которых располагаются его вершины.
  174. //Высота пустого дерева равна нулю, высота дерева из одного корня – единице.
  175. //На первом уровне дерева может быть только одна вершина – корень дерева,
  176. //на втором – потомки корня дерева, на третьем – потомки потомков корня дерева и т.д.
  177. int HeightBTree(BinTree* Tree) {
  178.     int x = 0, y = 0;
  179.     if (Tree == NULL) return 0;     //пустое дерево или дошли до листа
  180.     if (Tree->left) x = HeightBTree(Tree->left); //высота левого поддерева
  181.     if (Tree->right) y = HeightBTree(Tree->right);  //высота правого поддерева
  182.     if (x > y) return x + 1;    //+1 от корня к левому поддереву
  183.     else return y + 1;   //+1 от корня к правому поддереву
  184. }
  185. //поиск элемента в бинарном дереве поиска
  186. BinTree* Search(BinTree* Tree, int key) {
  187.     if (Tree == NULL) return NULL;
  188.     if (Tree->value == key) return Tree;
  189.     if (key < Tree->value) return Search(Tree->left, key);
  190.     else
  191.         return Search(Tree->right, key);
  192. }
  193.  
  194.  
  195. void DestroyBTree(BinTree* Tree) {
  196.     if (Tree != NULL) {
  197.         DestroyBTree(Tree->left);
  198.         DestroyBTree(Tree->right);
  199.         delete(Tree);
  200.     }
  201. }
  202. void Menu() {
  203.     BinTree* Tree = NULL;
  204.     int command;
  205.     int val;
  206.     cout << "Для проверки дерева его необходимо создать" << endl;
  207.     while (true) {
  208.         cout << endl;
  209.         cin >> command;
  210.         if (command == 1)
  211.         {
  212.             while (_getch() != 27) {
  213.                 cout << "ведите значение (для завершения ввода нажмите ESC) ";
  214.                 cin >> val;
  215.                 newBinTree(val, &Tree);
  216.             }
  217.         }
  218.         else {
  219.             if (command == 2)
  220.                 Print(&Tree, 0);
  221.  
  222.             else {
  223.                 if (command == 3) {
  224.                     cout << "Прямой обход дерева" << endl;
  225.                     TreeTraversalAndPrint(Tree);
  226.                 }
  227.                 else
  228.                     //cout << "Обратный обход дерева" << endl;
  229.                     //TreeTraversalAndPrint2(Tree);
  230.                 {
  231.                     if (command == 4)
  232.                         cout << "Cимметричный обход дерева" << endl;
  233.                     TreeTraversalAndPrint3(Tree);
  234.                 };
  235.                 /*cout << "Минимальный элемент дерева-> ";
  236.                 BinTree* min = MinValue(Tree);
  237.                 cout << min->value;
  238.                 cout << endl << "Максимальный элемент дерева-> ";
  239.                 BinTree* max = MaxValue(Tree);
  240.                 cout << max->value;*/
  241.                 cout << endl;
  242.                 cout << "Высота дерева-> ";
  243.                 int Heigh = HeightBTree(Tree);
  244.                 cout << Heigh;
  245.                 cout << endl;
  246.                 cout << "Количество элементов в дереве-> ";
  247.                 int a = NumberOfNodes(Tree);
  248.                 cout << a << endl;
  249.                 cout << "Количество листов в дереве-> ";
  250.                 int b = ListCount(Tree);
  251.                 cout << b << endl;
  252.                 cout << "Поиск элемента" << endl;
  253.                 int key;
  254.                 cout << "Введите значение элемента для поиска-> ";
  255.                 cin >> key;
  256.                 BinTree* Tree1 = Search(Tree, key);
  257.                 if (Tree1 == NULL)
  258.                     cout << "Элемент не найден";
  259.                 else
  260.                     cout << "Ваш элемент->" << Tree1->value;
  261.                 cout << endl;
  262.                 DestroyBTree(Tree);
  263.             }
  264.         }
  265.     }
  266. }
  267.  
  268. int main() {
  269.     SetConsoleCP(1251);
  270.     SetConsoleOutputCP(1251);
  271.     Menu();
  272.     system("pause");
  273.     return 0;
  274. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement