Advertisement
KrimsN

Untitled

Nov 13th, 2018
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.85 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <ctime>
  4. #include <windows.h>
  5. #include <clocale>
  6. using namespace std;
  7.  
  8. struct Node
  9. {
  10.     int x;
  11.     Node *l,*r;
  12. };
  13.  
  14. void show_n_l(Node *&Tree, int *sum, int n, int k = 1)
  15. {
  16.  
  17.     if (Tree != NULL)
  18.     {
  19.         if( n < k)
  20.             return;
  21.         if (n == k)
  22.         {
  23.             (*sum)++;
  24.             cout << Tree->x << ' ' << endl;
  25.         }
  26.        
  27.         show_n_l(Tree->l, sum, n, ++k);
  28.         k--;
  29.         if (n == k)
  30.         {
  31.             (*sum)++;
  32.             cout << Tree->x << ' ' << endl;
  33.         }
  34.        
  35.         show_n_l(Tree->r, sum, n, k++);
  36.     }
  37. }
  38.  
  39. int tree_count(std::ostream& _out, const Node* tr, int level, int i = 0){
  40.     int n = 0;
  41.     if(tr != NULL){
  42.         if(i == level){
  43.             ++n;
  44.             _out << tr->x << ' ';
  45.         }
  46.         if(tr->l != NULL)
  47.             n += tree_count(_out, tr->l,  level, i + 1);
  48.         if(tr->r != NULL)
  49.             n += tree_count(_out, tr->r, level, i + 1);
  50.     }
  51.     return n;
  52. }
  53.  
  54. void show_inx(Node *&Tree)
  55. {
  56.     if (Tree != NULL)
  57.     {
  58.         show_inx(Tree->l);
  59.             cout << Tree->x << '\t';
  60.         show_inx(Tree->r);
  61.     }
  62. }
  63.  
  64. void show_psf(Node *&Tree)
  65. {
  66.     if (Tree != NULL)
  67.     {
  68.         cout << Tree->x <<'\t';
  69.         show_psf(Tree->l);
  70.         show_psf(Tree->r);
  71.     }
  72. }
  73. void del(Node *&Tree){
  74.     if (Tree != NULL)
  75.     {
  76.         del(Tree->l);
  77.         del(Tree->r);
  78.         delete Tree;
  79.         Tree = NULL;
  80.     }
  81.  
  82. }
  83. void show_Tree(Node * Tree,int level = 0)
  84. {
  85.     if(Tree)
  86.     {
  87.         show_Tree(Tree->r,level + 1);
  88.         for(int i = 0;i< level;i++)
  89.             cout <<"    ";
  90.         printf("% 4d\n",Tree->x);
  91.         show_Tree(Tree->l,level + 1);
  92.     }
  93. }
  94.  
  95. void add_node(int x,Node *&MyTree)
  96. {
  97.     if (NULL == MyTree)
  98.     {
  99.         MyTree = new Node;
  100.         MyTree->x = x;
  101.         MyTree->l = MyTree->r = NULL;
  102.         return;
  103.     }
  104.     if (x <= MyTree->x)
  105.     {
  106.         if (MyTree->l != NULL)
  107.             add_node(x, MyTree->l);
  108.         else
  109.         {
  110.             MyTree->l = new Node;
  111.             MyTree->l->l = MyTree->l->r = NULL;
  112.             MyTree->l->x = x;
  113.         }
  114.         return;
  115.     }
  116.     if (MyTree->r != NULL)
  117.         add_node(x, MyTree->r);
  118.     else
  119.     {
  120.         MyTree->r = new Node;
  121.         MyTree->r->l = MyTree->r->r = NULL;
  122.         MyTree->r->x = x;
  123.     }
  124. }
  125. void add_cin(Node *&MyTree, int N)
  126. {
  127.     int wh_0;
  128.         for(int i = 1; i <= N; i++)
  129.         {
  130.             cout << "|  [" << i << "] : ";
  131.             cin >> wh_0;
  132.             add_node(wh_0, MyTree);
  133.         }
  134. }
  135. void add_rand(Node *&MyTree, int count)
  136. {
  137.    
  138.     if(count <= 0)
  139.         return;
  140.     srand(time(NULL));
  141.     int a;
  142.     for (int i = 0; i < count; ++i)
  143.     {
  144.         a = -50 + rand() % 100;
  145.         add_node(a, MyTree);
  146.     }
  147. }
  148. bool add_f(Node *&MyTree, const char * const f_name)
  149. {
  150.     int a;
  151.     ifstream myfile (f_name);
  152.     if (!myfile)
  153.     {
  154.         cout << "|  Ошибка при открытии файла или такого файла нет" << endl;
  155.         return false;
  156.     }
  157.     while (myfile)
  158.     {
  159.         myfile >> a;
  160.         add_node(a, MyTree);
  161.     }
  162.     return true;
  163. }
  164. int UI_s()
  165. {
  166.     int tmp;
  167.     setlocale(LC_ALL, "Russian");
  168.     system("cls");
  169.     cout << endl;
  170.     cout << "\t+--------------------------------------------------------------+" << endl;
  171.     cout << "\t|       Выберете, каким оброзом нужно заполнять дерево?        |" << endl;
  172.     cout << "\t+--------------------+--------------------+--------------------+" << endl;
  173.     cout << "\t|         1.         |          2.        |         3.         |" << endl;
  174.     cout << "\t|                    |                    |                    |" << endl;
  175.     cout << "\t|       Ввести       |      Используя     |         Из         |" << endl;
  176.     cout << "\t|         в          |     псевдорандом   |    *.txt фойла     |" << endl;
  177.     cout << "\t|       ручную       |                    |                    |" << endl;
  178.     cout << "\t|                    |                    |                    |" << endl;
  179.     cout << "\t+--------------------+--------------------+--------------------+" << endl << endl;
  180.     cout << "\t                                          +--------------------+" << endl;
  181.     cout << "\t                                          |   4.    Выход      |" << endl;
  182.     cout << "\t                                          +--------------------+" << endl << endl << endl << endl;
  183.     cout << "|  Ввод >> ";
  184.     cin >> tmp;
  185.     return tmp;
  186.  
  187. }
  188. int UI_e()
  189. {
  190.     int tmp;
  191.     setlocale(LC_ALL, "Russian");
  192.     system("cls");
  193.     cout << endl;
  194.     cout << "\t+--------------------------------------------------------------+" << endl;
  195.     cout << "\t|        Выберете, каким оброзом нужно вывести дерево?         |" << endl;
  196.     cout << "\t+--------------------+--------------------+--------------------+" << endl;
  197.     cout << "\t|         1.         |          2.        |         3.         |" << endl;
  198.     cout << "\t|                    |                    |                    |" << endl;
  199.     cout << "\t|         В          |          В         |         В          |" << endl;
  200.     cout << "\t|     инфиксной      |     префиксной     |        виде        |" << endl;
  201.     cout << "\t|       форме        |        форме       |       дерева       |" << endl;
  202.     cout << "\t|                    |                    |                    |" << endl;
  203.     cout << "\t+--------------------+--------------------+--------------------+" << endl << endl;
  204.     cout << "\t                                          +--------------------+" << endl;
  205.     cout << "\t                                          |   4.    Выход      |" << endl;
  206.     cout << "\t                                          +--------------------+" << endl << endl << endl << endl;
  207.     cout << "|  Ввод >> ";
  208.     cin >> tmp;
  209.     return tmp;
  210.  
  211. }
  212. int main(int argc, char const *argv[])
  213. {
  214.     setlocale( LC_ALL,"Rus" );
  215.     system("chcp 1251");
  216.     Node* Tree = NULL;
  217.     int con = 0, how_i = 0;
  218.     bool how_b = false;
  219.     char st;
  220. start:
  221.     do{
  222.         how_i = UI_s();
  223.         switch (how_i) {
  224.             case 1: {
  225.                 cout << "|  Введите сколько цифр вы хотите" << endl << "|  Ввод >> ";
  226.                 int a;
  227.                 cin >> a;
  228.                 if (a < 0) a = -a;
  229.                 add_cin(Tree, a);
  230.                 how_b = true;  
  231.                 break;
  232.             }
  233.             case 2: {
  234.                 cout << "|  Введите сколько цифр вы хотите" << endl << "|  Ввод >> ";
  235.                 int a;
  236.                 cin >> a;
  237.                 if (a < 0) a = -a;
  238.                 add_rand(Tree, a);
  239.                 how_b = true;  
  240.                 break;
  241.             }
  242.             case 3: {
  243.                 char text[20];
  244.                     add_f_m:
  245.  
  246.                 cout << endl << "|  Введите относительный путь к файлу" << endl << "|  Ввод >> ";
  247.                 scanf("%s", &text);
  248.                 if(!add_f(Tree, text)) goto add_f_m;
  249.                 how_b = true;
  250.                 break;
  251.             }
  252.             case 4: {
  253.                 cout << "|  Вы уверены? " << endl << "|  [y/n] >> ";
  254.                 cin >> st;
  255.                 if (st == 'n') goto start;
  256.                 del(Tree);
  257.                 system("cls");
  258.                 return 1;
  259.             }
  260.             default : break;
  261.  
  262.         }
  263.     }while(!how_b);
  264.    
  265.     cout << "|  [";
  266.     for (int i = 0; i < 50; ++i)
  267.     {
  268.         cout << "=";
  269.         Sleep(15);
  270.     }
  271.     cout << "] Done";
  272.     Sleep(400);
  273.  
  274. s_ui:
  275.     how_b = false;
  276.     do{
  277.         how_i = UI_e();
  278.         switch (how_i) {
  279.             case 1: {
  280.                 cout << "| << ";
  281.                 show_inx(Tree);
  282.                 cout << endl;
  283.                 how_b = true;  
  284.                 break;
  285.             }
  286.             case 2: {
  287.                 cout << "| << ";
  288.                 show_psf(Tree);
  289.                 cout << endl;
  290.                 how_b = true;
  291.                 break;
  292.             }
  293.             case 3: {
  294.                 show_Tree(Tree);
  295.                 //cout << endl;
  296.                 how_b = true;
  297.                 break;
  298.             }
  299.             case 4: {
  300.                 cout << "Вы уверены? " << endl << "|   [y/n] >> ";
  301.                 cin >> st;
  302.                 if (st == 'n') goto s_ui;
  303.                 del(Tree);
  304.                 system("cls");
  305.                 return 1;
  306.             }
  307.             default : break;
  308.  
  309.         }
  310.     }while(!how_b);
  311.     int n;
  312.     cout << "Введите уровень, на котором ъотите подсчитать кол-во элементов" << endl << "|  Ввод >> ";
  313.     cin >> n;
  314.     cout << endl;
  315.     int Sum = tree_count(std::cout, Tree, n);
  316.     cout << endl << "На " << n << " уровне - " << Sum << " элементов" << endl;
  317.  
  318.     cout << "Запустить заново? [y/n] ";
  319.     cin >> st;
  320.     if (st == 'y') { del(Tree); goto start;}
  321.     system("pause && cls");
  322.     return 0;
  323. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement