DilyaraL

17.7

May 16th, 2018
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.93 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include<iostream>
  3. #include<fstream>
  4. using namespace std;
  5. ////////////////////////
  6. struct treeNode
  7. {
  8. treeNode* left;
  9. treeNode* right;
  10. int data;
  11. };
  12. ///////////////////////
  13. struct stackNode
  14. {
  15. stackNode* next;
  16. treeNode* node;
  17. };
  18. //////////////////////
  19. void push_tree(treeNode* &tree_top, int x)
  20. {
  21. treeNode *p, *m;
  22. bool b;
  23. if (tree_top == NULL)
  24. {
  25. m = new treeNode;
  26. m->data = x;
  27. m->left = NULL;
  28. m->right = NULL;
  29. tree_top = m;//root
  30. }
  31. else
  32. {
  33. m = tree_top;
  34. b = true;
  35. while (b)
  36. {
  37. if (x >= m->data)
  38. {
  39. if (m->right)
  40. m = m->right;
  41. else
  42. {
  43. p = new treeNode;
  44. p->data = x;
  45. p->left = NULL;
  46. p->right = NULL;
  47. m->right = p;
  48. b = false;
  49. }
  50. }
  51. else
  52. {
  53. if (m->left) m = m->left;
  54. else
  55. {
  56. p = new treeNode;
  57. p->data = x;
  58. p->left = NULL;
  59. p->right = NULL;
  60. m->left = p;
  61. b = false;
  62. }
  63. }
  64. }
  65. }
  66.  
  67. }
  68. /////////////////////////////////////////////////
  69. void push_stack(stackNode* &stack_top, treeNode* t)
  70. {
  71. stackNode* p;
  72. p = new stackNode;
  73. p->node = t;
  74. p->next = stack_top;
  75. stack_top = p;
  76. }
  77. //////////////////////////////////////////////////////////////
  78. void create_tree(ifstream &f, treeNode* &tree_top)
  79. {
  80. tree_top = NULL;
  81. int x;
  82. while (f >> x)
  83. {
  84. push_tree(tree_top, x);
  85. }
  86. }
  87. /////////////////////////
  88. void pop_stack(stackNode* &stack_top, treeNode* &t)
  89. //get node of tree from stack
  90. {
  91. stackNode *p;
  92. if (stack_top)
  93. {
  94. t = stack_top->node;
  95. p = stack_top->next;
  96. delete stack_top;
  97. stack_top = p;
  98. }
  99. }
  100. /////////////////////////////////////////////////////////////
  101. void print_node(int x)
  102. {
  103. cout << " " << x;
  104. }
  105. ////////////////////////////
  106. void inorder_tree(treeNode* tree_top)//печать обход в глубину (по порядку) с левым уклоном
  107. {
  108. stackNode* stack_top;
  109. treeNode* tree_p;
  110. tree_p = tree_top;
  111. stack_top = NULL;
  112. do
  113. {
  114. while (tree_p)
  115. {
  116. while (tree_p->left)
  117. {
  118. push_stack(stack_top, tree_p);
  119. tree_p = tree_p->left;
  120. }
  121. print_node(tree_p->data);
  122. tree_p = tree_p->right;
  123. }
  124.  
  125. if (stack_top)
  126. {
  127. pop_stack(stack_top, tree_p);
  128. print_node(tree_p->data);
  129. tree_p = tree_p->right;
  130. }
  131. } while (stack_top || tree_p);
  132. cout << endl;
  133. }
  134. //////////////////////////////////////
  135. void taskA(treeNode* tree_top, int &e)
  136. {
  137. treeNode* tree_p;
  138. tree_p = tree_top;
  139. while (tree_p->left)
  140. tree_p = tree_p->left;
  141. e= tree_p->data;
  142. }
  143.  
  144. void taskB(treeNode* tree_top, int e)
  145. {
  146. stackNode* stack_top;
  147. treeNode* tree_p;
  148. tree_p = tree_top;
  149. int k = 0;
  150. stack_top = NULL;
  151. if (!tree_p)
  152. {
  153. do
  154. {
  155. while (tree_p)
  156. {
  157. while (tree_p->left)
  158. {
  159. push_stack(stack_top, tree_p);
  160. tree_p = tree_p->left;
  161. }
  162. if (tree_p->data == e)
  163. k++;
  164. tree_p = tree_p->right;
  165. }
  166.  
  167. if (stack_top)
  168. {
  169. pop_stack(stack_top, tree_p);
  170. if (tree_p->data == e)
  171. k++;
  172. tree_p = tree_p->right;
  173. }
  174. } while (stack_top || tree_p);
  175. cout << 'k' << k << endl;
  176. }
  177. else
  178. cout << "Tree is empy" << endl;
  179. }
  180.  
  181. void taskC(treeNode* tree_top)
  182. {
  183. stackNode* stack_top;
  184. treeNode* tree_p;
  185. tree_p = tree_top;
  186. double s = 0;
  187. int k = 0;
  188. stack_top = NULL;
  189. do
  190. {
  191. while (tree_p)
  192. {
  193. while (tree_p->left)
  194. {
  195. push_stack(stack_top, tree_p);
  196. tree_p = tree_p->left;
  197. }
  198. s += tree_p->data;
  199. k++;
  200. tree_p = tree_p->right;
  201. }
  202.  
  203. if (stack_top)
  204. {
  205. pop_stack(stack_top, tree_p);
  206. s += tree_p->data;
  207. k++;
  208. tree_p = tree_p->right;
  209. }
  210. } while (stack_top || tree_p);
  211. cout << "sp= " <<s/ k << endl;
  212. }
  213.  
  214. void taskD(treeNode*&tree_top)
  215. {
  216. stackNode* stack_top;
  217. treeNode* tree_p;
  218. tree_p = tree_top;
  219. stack_top = NULL;
  220. if (!tree_p)
  221. {
  222. do
  223. {
  224. while (tree_p)
  225. {
  226. while (tree_p->left)
  227. {
  228. push_stack(stack_top, tree_p);
  229. tree_p = tree_p->left;
  230. }
  231. if (tree_p->data < 0)
  232. tree_p->data = (-1)*tree_p->data;
  233. tree_p = tree_p->right;
  234. }
  235.  
  236. if (stack_top)
  237. {
  238. pop_stack(stack_top, tree_p);
  239. if (tree_p->data < 0)
  240. tree_p->data = (-1)*tree_p->data;
  241. tree_p = tree_p->right;
  242. }
  243. } while (stack_top || tree_p);
  244. inorder_tree(tree_top);
  245. }
  246. else
  247. cout << "Tree is empy" << endl;
  248. }
  249.  
  250. void taskE(treeNode*&tree_top)
  251. {
  252. stackNode* stack_top;
  253. treeNode* tree_p,*tmin=tree_top,*tmax=tree_top;
  254. tree_p = tree_top;
  255. stack_top = NULL;
  256. do
  257. {
  258. while (tree_p)
  259. {
  260. while (tree_p->left)
  261. {
  262. push_stack(stack_top, tree_p);
  263. tree_p = tree_p->left;
  264. }
  265. if (tree_p->data < tmin->data)
  266. tmin = tree_p;
  267. else
  268. if(tree_p->data > tmax->data)
  269. tmax = tree_p;
  270. tree_p = tree_p->right;
  271. }
  272.  
  273. if (stack_top)
  274. {
  275. pop_stack(stack_top, tree_p);
  276. if (tree_p->data < tmin->data)
  277. tmin = tree_p;
  278. else
  279. if (tree_p->data > tmax->data)
  280. tmax = tree_p;
  281. tree_p = tree_p->right;
  282. }
  283. } while (stack_top || tree_p);
  284. int l = tmax->data;
  285. tmax->data = tmin->data;
  286. tmin->data = l;
  287. inorder_tree(tree_top);
  288. }
  289.  
  290. void taskF(treeNode*&tree_top)
  291. {
  292. stackNode* stack_top;
  293. treeNode* tree_p;
  294. tree_p = tree_top;
  295. stack_top = NULL;
  296. if (!tree_p)
  297. {
  298. do
  299. {
  300. while (tree_p)
  301. {
  302. while (tree_p->left)
  303. {
  304. push_stack(stack_top, tree_p);
  305. tree_p = tree_p->left;
  306. }
  307. if (!tree_p->left && !tree_p->right)
  308. cout << tree_p->data << ' ';
  309. tree_p = tree_p->right;
  310. }
  311.  
  312. if (stack_top)
  313. {
  314. pop_stack(stack_top, tree_p);
  315. if (!tree_p->left && !tree_p->right)
  316. cout << tree_p->data << ' ';
  317. tree_p = tree_p->right;
  318. }
  319. } while (stack_top || tree_p);
  320. }
  321. else
  322. cout << "Tree is empy" << endl;
  323. }
  324.  
  325.  
  326. void main()
  327. {
  328. ifstream f("arb.txt");
  329. int x;
  330. treeNode* tree_top;
  331. create_tree(f, tree_top);
  332. f.close();
  333. inorder_tree(tree_top);
  334.  
  335. //taskF(tree_top);
  336.  
  337. int e;
  338. cin >> e;
  339. taskB(tree_top, e);
  340.  
  341. system("pause");
  342. }
Advertisement
Add Comment
Please, Sign In to add comment