Advertisement
spacerose

бинарное дерево поиска

Sep 21st, 2020
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.93 KB | None | 0 0
  1. #include "stdafx.h"
  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. void newBinTree(int val, BinTree** Tree) {
  16.     if ((*Tree) == NULL)
  17.     {
  18.         (*Tree) = new BinTree; //Выделить память
  19.         (*Tree)->value = val;  //Поместить в выделенное место аргумент
  20.         (*Tree)->left = (*Tree)->right = NULL;
  21.         return;
  22.     }
  23.     if (val > (*Tree)->value) newBinTree(val, &(*Tree)->right);//Если аргумент больше чем текущий элемент, поместить его вправо
  24.     else newBinTree(val, &(*Tree)->left);//Иначе поместить его влево
  25. }
  26. //Для печати дерева
  27. void Print(BinTree**Tree, int l)
  28. {
  29.     int i;
  30.  
  31.     if (*Tree != NULL)
  32.     {
  33.         Print(&((**Tree).right), l + 1);
  34.         for (i = 1; i <= l; i++) cout << "   ";
  35.         cout << (**Tree).value << endl;
  36.         Print(&((**Tree).left), l + 1);
  37.     }
  38. }
  39.  
  40. void TreeTraversalAndPrint(BinTree* Root) {
  41.     if (Root != NULL) {
  42.         cout << Root->value << endl;
  43.         TreeTraversalAndPrint(Root->left);
  44.         TreeTraversalAndPrint(Root->right);
  45.  
  46.     }
  47. }
  48.  
  49. void TreeTraversalAndPrint2(BinTree* Root) {
  50.     if (Root != NULL) {
  51.         TreeTraversalAndPrint2(Root->left);
  52.         TreeTraversalAndPrint2(Root->right);
  53.         cout << Root->value << endl;
  54.     }
  55. }
  56. void TreeTraversalAndPrint3(BinTree* Root) {
  57.     if (Root != NULL) {
  58.         TreeTraversalAndPrint2(Root->left);
  59.         cout << Root->value << endl;
  60.         TreeTraversalAndPrint2(Root->right);
  61.     }
  62. }
  63. //Так как в бинарном дереве поиска для каждого узла справедливо, что left < right,
  64. //то соответственно для нахождения наименьшенго элемента
  65. //надо топать от корня по левым веткам до упора - там и будет наименьший.
  66. BinTree* MinValue(BinTree* Tree)
  67. {
  68.     if (Tree->left != NULL) {
  69.         return MinValue(Tree->left);
  70.     }
  71.     else {
  72.         return Tree;
  73.     }
  74. }
  75. //Так как в бинарном дереве поиска для каждого узла справедливо, что left < right,
  76. //то соответственно для нахождения наибольшего элемента
  77. //надо топать от корня по правым веткам до упора - там и будет наибольший.
  78. BinTree* MaxValue(BinTree* Tree)
  79. {
  80.     if (Tree->right != NULL) {
  81.         return  MaxValue(Tree->right);
  82.     }
  83.     else {
  84.         return Tree;
  85.     }
  86. }
  87. int NumberOfNodes(BinTree* Tree) {
  88.     if (Tree == NULL) return 0;
  89.     return NumberOfNodes(Tree->left) + 1+ NumberOfNodes(Tree->right);
  90. }
  91.  
  92. int ListCount(BinTree* node)
  93. {
  94.     if (!node)
  95.         return 0;
  96.     if (!node->left && !node->right)
  97.         return 1;
  98.     return  ListCount(node->left) + ListCount(node->right);
  99. }
  100.  
  101. //Высота(максимальная глубина) дерева определяется количеством уровней,
  102. //на которых располагаются его вершины.
  103. //Высота пустого дерева равна нулю, высота дерева из одного корня – единице.
  104. //На первом уровне дерева может быть только одна вершина – корень дерева,
  105. //на втором – потомки корня дерева, на третьем – потомки потомков корня дерева и т.д.
  106. int HeightBTree(BinTree* Tree) {
  107.     int x = 0, y = 0;
  108.     if (Tree == NULL) return 0;     //пустое дерево или дошли до листа
  109.     if(Tree->left) x = HeightBTree(Tree->left); //высота левого поддерева
  110.     if (Tree->right) y = HeightBTree(Tree->right);  //высота правого поддерева
  111.     if (x > y) return x + 1;    //+1 от корня к левому поддереву
  112.     else return y + 1;   //+1 от корня к правому поддереву
  113. }
  114. //поиск элемента в бинарном дереве поиска
  115. BinTree* Search(BinTree* Tree, int key) {
  116.     if (Tree == NULL) return NULL;
  117.     if  (Tree->value == key) return Tree;
  118.     if (key < Tree->value) return Search(Tree->left, key);
  119.     else
  120.         return Search(Tree->right, key);
  121. }
  122.  
  123.  
  124. void DestroyBTree(BinTree* Tree) {
  125.     if (Tree != NULL) {
  126.         DestroyBTree(Tree->left);
  127.         DestroyBTree(Tree->right);
  128.         delete(Tree);
  129.     }
  130. }
  131. void MenuProc() {
  132.     BinTree* Tree = NULL;
  133.     char variant;
  134.     int val;
  135.     cout << "Для проверки дерева его необходимо создать" << endl;
  136.     while (_getch() != 27) {
  137.         cout << "ведите значение (для завершения ввода нажмите ESC) ";
  138.         cin >> val;
  139.         newBinTree(val, &Tree);
  140.     }
  141.     Print(&Tree, 0);
  142.     cout << "Прямой обход дерева" << endl;
  143.     TreeTraversalAndPrint(Tree);
  144.     cout << "Обратный обход дерева" << endl;
  145.     TreeTraversalAndPrint2(Tree);
  146.     cout << "Cимметричный обход дерева" << endl;
  147.     TreeTraversalAndPrint3(Tree);
  148.     cout << "Минимальный элемент дерева-> ";
  149.     BinTree* min = MinValue(Tree);
  150.     cout << min->value;
  151.     cout << endl << "Максимальный элемент дерева-> ";
  152.     BinTree* max = MaxValue(Tree);
  153.     cout << max->value;
  154.     cout << endl;
  155.     cout << "Высота дерева-> ";
  156.     int Heigh = HeightBTree(Tree);
  157.     cout << Heigh;
  158.     cout << endl;
  159.     cout<<"Количество элементов в дереве-> ";
  160.     int a = NumberOfNodes(Tree);
  161.     cout << a << endl;
  162.     cout << "Количество листов в дереве-> ";
  163.     int b = ListCount(Tree);
  164.     cout << b<< endl;
  165.     cout << "Поиск элемента" << endl;
  166.     int key;
  167.     cout << "Введите значение элемента для поиска-> ";
  168.     cin >> key;
  169.     BinTree* Tree1 = Search(Tree,key);
  170.     if (Tree1 == NULL)
  171.         cout << "Элемент не найден";
  172.     else
  173.         cout << "Ваш элемент->" << Tree1->value;
  174.     cout << endl;
  175.     DestroyBTree(Tree);
  176. }
  177.  
  178. int main() {
  179.     SetConsoleCP(1251);
  180.     SetConsoleOutputCP(1251);
  181.     MenuProc();
  182.     system("pause");
  183.     return 0;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement