Advertisement
Guest User

Untitled

a guest
Dec 19th, 2014
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.24 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "iostream"
  3. #include <conio.h>
  4.  
  5. using namespace std;
  6. struct node
  7. {
  8. int key;//корень
  9. int count;//счётчик
  10. node *left;//указатель на левое поддерево
  11. node *right;//указатель на правое поддерево
  12. }; node *tree;//указатель
  13.  
  14. void print_Tree(node *p, int level)
  15. {
  16. if (p)
  17. {
  18. print_Tree(p->left, level + 1);
  19. for (int i = 0; i< level; i++) cout << " ";
  20. cout << p->key << endl;
  21. print_Tree(p->right, level + 1);
  22. }
  23. }
  24. void ObhodEnd(node **w)//обратный обход
  25. {
  26. if (*w != NULL)//если дерево не нулевое
  27. {
  28. ObhodEnd(&((**w).left));
  29. ObhodEnd(&((**w).right));
  30. cout << (**w).key << " " << endl;
  31. }
  32.  
  33. }
  34. void ObhodBack(node **w)//симметричный обход
  35. {
  36. if (*w != NULL)
  37. {
  38. ObhodBack(&((**w).left));
  39. cout << (**w).key << " ";
  40. ObhodBack(&((**w).right));
  41. cout << endl;
  42. }
  43.  
  44. }
  45. void Obhodleft(node **w)//прямой обход
  46. {
  47. if (*w != NULL)
  48. {
  49. cout << (**w).key << " ";
  50. Obhodleft(&((**w).left));
  51. Obhodleft(&((**w).right));
  52. cout << endl;
  53. }
  54.  
  55. }
  56. void obhodnach(int el, node**p)
  57. {
  58. if (*p == NULL)
  59. {
  60. *p = new (node);
  61. (**p).key = el;
  62. (**p).count = 1;
  63. (**p).left = NULL;
  64. (**p).right = NULL;
  65. }
  66. else
  67. {
  68. if (el<(**p).key)
  69. obhodnach(el, &((**p).left));
  70. else
  71. if (el>(**p).key)
  72. obhodnach(el, &((**p).right));
  73. else
  74. (**p).count = (**p).count + 1;
  75.  
  76. }
  77.  
  78. }
  79. void obhodright(int el, node**p)
  80. {
  81. if (*p != NULL)
  82. {
  83. if (el<(**p).key)
  84. obhodright(el, &((**p).right));
  85. else
  86. if (el>(**p).key)
  87. obhodright(el, &((**p).left));
  88. else
  89. (**p).count = (**p).count + 1;
  90. }
  91. else
  92. {
  93. *p = new (node);
  94. (**p).key = el;
  95. (**p).count = 1;
  96. (**p).left = NULL;
  97. (**p).right = NULL;
  98. }
  99. }
  100. void obhodleft(int el, node**p)
  101. {
  102. if (*p != NULL)
  103. {
  104. if (el<(**p).key)
  105. obhodleft(el, &((**p).left));
  106. else
  107. if (el>(**p).key)
  108. obhodleft(el, &((**p).right));
  109. else
  110. (**p).count = (**p).count + 1;
  111. }
  112. else
  113. {
  114. *p = new (node);
  115. (**p).key = el;
  116. (**p).count = 1;
  117. (**p).left = NULL;
  118. (**p).right = NULL;
  119. }
  120. }
  121. void Delete_1(node **r, node **q)//удаление узла
  122. {
  123. node *s;
  124.  
  125. if ((**r).right == NULL)
  126. {
  127. (**q).key = (**r).key; (**q).count = (**r).count;
  128. *q = *r;
  129. s = *r; *r = (**r).left; delete s;
  130. }
  131. else Delete_1(&((**r).right), q);
  132. }
  133. void Delete(node **p, int k)//удаление листа
  134. {
  135. node *q;
  136.  
  137. if (*p == NULL) cout << "Вершина с заданным ключом не найдена!\n";
  138. else
  139. if (k<(**p).key) Delete(&((**p).left), k);
  140. else
  141. if (k>(**p).key) Delete(&((**p).right), k);
  142. else
  143. {
  144. q = *p;
  145. if ((*q).right == NULL) { *p = (*q).left; delete q; }
  146. else
  147. if ((*q).left == NULL) { *p = (*q).right; delete q; }
  148. else Delete_1(&((*q).left), &q);
  149. }
  150. }
  151.  
  152. //void Delete1(node **r,node **q)
  153. //{
  154. // node *s;
  155. // if((**q).right==NULL)
  156. // {
  157. // (**q).key=(**r).key;
  158. // (**q).key=(**r).key;
  159. // (**q).count=(**r).count;
  160. // *q=*r;
  161. // s=*r;
  162. // *r=(**r).left;
  163. // delete s;
  164. // }
  165. // else
  166. // Delete1(&((**r).right),q);
  167. //}
  168. //
  169. //void Delete(node **tree,int k)
  170. //{
  171. // node*q;
  172. // if (*tree==NULL)
  173. // cout<<"Вершина с заданным ключом не найдена";
  174. // else
  175. // {
  176. // if(k<(**tree).key)
  177. // Delete(&((**tree).left),k);
  178. // else
  179. // {
  180. // if(k>(**tree).key)
  181. // Delete(&((**tree).right),k);
  182. // else
  183. // q=*tree;
  184. // if((*q).right==NULL)
  185. // {
  186. // *tree=(*q).left;
  187. // delete q;
  188. // }
  189. // else
  190. // if((*q).left==NULL)
  191. // {
  192. // *tree=(*q).right;
  193. // delete q;
  194. // }
  195. // else
  196. // Delete1(&((*q).left),&q);
  197. // }
  198. // }
  199. //}
  200. void buidtree()
  201. {
  202. int el;
  203. tree = NULL;
  204. cout << "Введите лист дерева" << endl;
  205. cin >> el;
  206. while (el != 0)
  207. {
  208. obhodnach(el, &tree);
  209. /*obhodright(el,&tree);
  210. obhodleft(el,&tree);*/
  211. cin >> el;
  212. }
  213. }
  214.  
  215. int _tmain(int argc, _TCHAR* argv[])
  216. {
  217. char otv, otv2;
  218. setlocale(LC_ALL, "Russian");
  219. do
  220. {
  221. cout << "1.Построение дерева" << endl << "2.Удаление вершины дерева" << endl << "3.Вывод дерева на экран" << endl << "4.Добавление листа" << endl << "5.Прямой обход" << endl << "6.Обратный обход" << endl << "7.Симметричный обход" << endl << "0.Выход" << endl;
  222. cin >> otv;
  223. switch (otv)
  224. {
  225. case '1':
  226. buidtree();
  227. break;
  228. case '2':
  229. int k;
  230. cout << "Введите ключ удаляемой вершины" << endl;
  231. cin >> k;
  232. Delete(&tree, k);
  233. cout << "Вершина удалена" << endl;
  234. break;
  235. case '3':
  236. cout << "вывод дерева" << endl;
  237. print_Tree(tree, 0);
  238.  
  239. break;
  240. case '4':
  241. int el;
  242. cin >> el;
  243. obhodnach(el, &tree);
  244. break;
  245. case '5':
  246. cout << "вывод дерева" << endl;
  247. Obhodleft(&tree);
  248. break;
  249. case '6':
  250. cout << "вывод дерева" << endl;
  251. ObhodEnd(&tree);
  252. break;
  253. case '7':
  254. cout << "вывод дерева" << endl;
  255. ObhodBack(&tree);
  256. break;
  257. default:
  258. cout << "Ошибка" << endl;
  259. break;
  260. }
  261. } while (otv != '0');
  262. cin.get();
  263. _getch();
  264. return 0;
  265.  
  266. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement