Advertisement
Guest User

Untitled

a guest
Oct 25th, 2016
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.76 KB | None | 0 0
  1. /*генерируем 22 уникальных 4-х значных числа представляем их в виде поискового
  2. бинарного дерева и выводим прямой порядок прохождения построенного дерева
  3. */
  4.  
  5. #include <iostream>
  6. #include <cstdlib>
  7. #include <cstdio>
  8. #include <time.h>
  9. #include <set>
  10. #include <iomanip>
  11.  
  12.  
  13. const int N = 22;
  14. int elements[N];
  15. using namespace std;
  16.  
  17. int tabs = 0; //Для создания отступов
  18. //Кол-во отступов высчитывается по кол-ву рекурсивного вхождения при выводе в фукцию print
  19.  
  20. //Структура ветки
  21. struct Branch
  22. {
  23. int Data; //Поле данных
  24. Branch *LeftBranch; //УКАЗАТЕЛИ на соседние веточки
  25. Branch *RightBranch;
  26. };
  27.  
  28.  
  29. //Функция внесения данных
  30. void Add(int aData, Branch *&aBranch)
  31. {
  32. //Если ветки не существует
  33. if (!aBranch)
  34. { //создадим ее и зададим в нее данные
  35. aBranch = new Branch;
  36. aBranch->Data = aData;
  37. aBranch->LeftBranch = 0;
  38. aBranch->RightBranch = 0;
  39. return;
  40. }
  41. else //Иначе сверим вносимое
  42. if (aBranch->Data>aData)
  43. { //Если оно меньше того, что в этой ветке - добавим влево
  44. Add(aData, aBranch->LeftBranch);
  45. }
  46. else
  47. { //Иначе в ветку справа
  48. Add(aData, aBranch->RightBranch);
  49. };
  50. }
  51.  
  52. //Функция вывода дерева
  53. void print(Branch *aBranch)
  54. {
  55. if (!aBranch) return; //Если ветки не существует - выходим. Выводить нечего
  56. tabs++; //Иначе увеличим счетчик рекурсивно вызванных процедур
  57. //Который будет считать нам отступы для красивого вывода
  58.  
  59. print(aBranch->LeftBranch); //Выведем ветку и ее подветки слева
  60.  
  61. for (int i = 0; i<tabs; i++) cout << " "; //Потом отступы
  62. cout << aBranch->Data << endl; //Данные этой ветки
  63.  
  64.  
  65. print(aBranch->RightBranch);//И ветки, что справа
  66.  
  67. tabs--; //После уменьшим кол-во отступов
  68. return;
  69. }
  70.  
  71. void FreeTree(Branch *aBranch)
  72. {
  73. if (!aBranch) return;
  74. FreeTree(aBranch->LeftBranch);
  75. FreeTree(aBranch->RightBranch);
  76. delete aBranch;
  77. return;
  78. }
  79.  
  80. /*void Show(Branch *aBranch)
  81. {
  82. if (aBranch == NULL) return; //Если дерева нет, выходим
  83.  
  84. cout<< (aBranch -> Data); //Посетили узел
  85. Show(aBranch->LeftBranch); //Обошли левое поддерево
  86. Show(aBranch->RightBranch); //Обошли правое поддерево
  87. }
  88. */
  89.  
  90. int main()
  91. {
  92. Branch *Root = 0;
  93. set <int> check;
  94. setlocale(LC_ALL, "Russian");
  95.  
  96. //генерируем числа и записываем их в массив
  97. for (int i = 0; i < N; ++i) {
  98. elements[i] = rand() % 9000 + 10000;
  99. while (check.count(elements[i]))
  100. elements[i] = rand() % 90000 + 10000;
  101. check.insert(elements[i]);
  102. }
  103. //вывод сгенерированных чисел
  104. cout << "Генерация неповторяющихся чисел:" << endl;
  105. for (int i = 0; i < N; ++i)
  106. cout << setw(2) << setw(4) << elements[i] << " " << endl;
  107. cout << " Поисковое дерево:" << endl;
  108. for (int i = 0; elements[i] ; i++)
  109. {
  110. Add(elements[i] , Root);
  111. }
  112.  
  113. print(Root);
  114. FreeTree(Root);
  115. cout << "Прямой обход:" << endl;
  116. //Show(Root); //Обошли дерево и показали его звенья в линейном порядке
  117. cin.get();
  118. return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement