Advertisement
p0lich

RBT

Apr 24th, 2017
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.77 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. struct tree
  7. {
  8. int inf;
  9. string color;
  10. tree *right ;
  11. tree *left ;
  12. tree *parent;
  13. };
  14.  
  15. void RotateLeft(tree *tr);
  16. void RotateRight(tree *tr);
  17.  
  18. tree *node(int x) //начальный узел
  19. {
  20. tree *n = new tree;
  21. n->color = "red";
  22. n->inf = x;
  23. n->left = n->right = NULL;
  24. n->parent = NULL;
  25. return n;
  26. }
  27.  
  28. void insert(tree *&tr, int x) //вставка
  29. {
  30. tree *n = node(x);
  31. if (!tr )
  32. tr = n; //если дерево пустое - корень
  33. else
  34. {
  35. tree *y = tr;
  36. while(y)
  37. { //ищем куда вставлять
  38. if (n->inf > y->inf) //правая ветка
  39. if (y->right)
  40. y = y->right;
  41. else
  42. {
  43. n->parent = y; //узел становится правым ребенком
  44. y->right = n;
  45. break;
  46. }
  47. else
  48. if (n->inf < y->inf)//левая ветка
  49. if (y->left)
  50. y = y->left;
  51. else
  52. {
  53. n->parent = y;//узел становится левым ребенком
  54. y->left = n;
  55. break;
  56. }
  57. }
  58. }
  59.  
  60. while((tr->parent != NULL) && (tr->parent->color == "red"))
  61. {
  62. tree *y = tr;
  63. if (tr->parent = tr->parent->parent->left)
  64. {
  65. y = tr->parent->parent->right;
  66. if (y->color == "red")
  67. {
  68. tr->parent->color = "black";
  69. y->color = "black";
  70. tr->parent->parent->color = "red";
  71. tr = tr->parent->parent;
  72. }
  73. else
  74. {
  75. if (tr = tr->parent->right)
  76. {
  77. tr = tr->parent;
  78. RotateLeft(tr);
  79. }
  80. tr->parent->color = "black";
  81. tr->parent->parent->color = "red";
  82. RotateRight(tr->parent->parent);
  83. }
  84. }
  85. else
  86. {
  87. y = tr->parent->parent->left;
  88. if (y->color == "red")
  89. {
  90. tr->parent->color = "black";
  91. y->color = "black";
  92. tr->parent->parent->color = "red";
  93. tr = tr->parent->parent;
  94. }
  95. else
  96. {
  97. if (tr = tr->parent->left)
  98. {
  99. tr = tr->parent;
  100. RotateLeft(tr);
  101. }
  102. tr->parent->color = "black";
  103. tr->parent->parent->color = "red";
  104. RotateRight(tr->parent->parent);
  105. }
  106. }
  107. }
  108. tr->color = "black";
  109. }
  110.  
  111. void RotateLeft(tree *tr)
  112. {
  113. tree *y = tr->right;
  114. tr->right = tr->left;
  115.  
  116. if (y->left != NULL)
  117. tr->parent->left = tr;
  118. y->parent = tr->parent;
  119. if (tr->parent == NULL)
  120. tr = y;
  121. else
  122. {
  123. if(tr == tr->parent->left)
  124. tr->parent->left = y;
  125. else
  126. tr->parent->right = y;
  127. }
  128. y->left = tr;
  129. tr->parent = y;
  130. }
  131.  
  132. void RotateRight(tree *tr)
  133. {
  134. tree *y = tr->left;
  135. tr->left = tr->right;
  136.  
  137. if (y->left != NULL)
  138. tr->parent->left = tr;
  139. y->parent = tr->parent;
  140. if (tr->parent == NULL)
  141. tr = y;
  142. else
  143. {
  144. if(tr == tr->parent->left)
  145. tr->parent->left = y;
  146. else
  147. tr->parent->right = y;
  148. }
  149. y->right = tr;
  150. tr->parent = y;
  151. }
  152.  
  153. void preorder (tree *tr)
  154. { // прямой обход (К-Л-П)
  155. if (tr)
  156. {
  157. cout << tr->inf << " " << tr->color << endl; //корень
  158. preorder( tr->left); //левое
  159. preorder( tr->right); //правое
  160. }
  161. }
  162.  
  163. void postorder (tree *tr)
  164. { // обратный обход (Л-П-К)
  165. if (tr)
  166. {
  167. postorder( tr->left); //левое
  168. postorder( tr->right); //правое
  169. cout << tr->inf << " " << tr->color << endl; //корень
  170. }
  171. }
  172.  
  173.  
  174. void inorder(tree *tr)
  175. {// симметричный обход (Л-К-П)
  176. if(tr)
  177. {
  178. inorder ( tr->left); //левое
  179. cout << tr->inf << " " << tr->color << endl; //корень
  180. inorder ( tr->right); //правое
  181. }
  182. }
  183.  
  184. tree *find( tree *tr, int x)
  185. {//поиск
  186. if (! tr || x == tr->inf)//нашли или дошли до конца ветки
  187. return tr;
  188. if (x < tr->inf)
  189. return find(tr->left, x);//ищем по левой ветке
  190. else
  191. return find(tr->right, x);//ищем по правой ветке
  192. }
  193.  
  194. tree *Min(tree *tr)
  195. {//поиск min
  196. if (! tr->left)
  197. return tr;//нет левого ребенка
  198. else
  199. return Min(tr->left);//идем по левой ветке до конца
  200. }
  201.  
  202. tree *Max(tree *tr)
  203. {//поиск max
  204. if (! tr->right)
  205. return tr;//нет правого ребенка
  206. else
  207. return Max(tr->right);//идем по правой ветке до конца
  208. }
  209.  
  210. tree *Next(tree*tr, int x)
  211. {//поиск следующего
  212. tree* n = find( tr , x);
  213. if (n->right)//если есть правый ребенок
  214. return Min(n->right);//min по правой ветке
  215. tree *y = n->parent; //родитель
  216. while (y && n == y->right)
  217. {//пока не дошли до корня или узел - правый ребенок
  218. n = y;//идем вверх по дереву
  219. y = y->parent;
  220. }
  221. return y;//возвращаем родителя
  222. }
  223.  
  224. tree *Prev(tree *tr, int x)
  225. {//поиск предыдущего
  226. tree *n = find(tr , x);
  227. if (n->left)//если есть левый ребенок
  228. return Max(n->left);//max по левой ветке
  229. tree *y = n->parent;//родитель
  230. while(y && n == y->left)
  231. {//пока не дошли до корня или узел - левый ребенок
  232. n = y;//идем вверх по дереву
  233. y = y->parent;
  234. }
  235. return y;//возвращаем родителя
  236. }
  237.  
  238.  
  239. void Delete(tree *&tr, tree *v)
  240. {//удаление узла
  241. tree *p = v->parent;
  242. if (!p)
  243. tr = NULL; //дерево содержит один узел
  244. else if (!v->left && !v->right)
  245. {//если нет детей
  246. if (p->left == v) //указатель у родителя меняем на NULL
  247. p->left = NULL;
  248. if (p->right == v)
  249. p->right = NULL;
  250. delete v;
  251. }
  252. else if (!v->left || !v->right)
  253. {//если только один ребенок
  254. if (!p)
  255. { //если удаляем корень, у которого 1 ребенок
  256. if (!v->left)
  257. { //если есть правый ребенок
  258. tr = v->right; //он становится корнем
  259. v->parent = NULL;
  260. }
  261. else
  262. { //аналогично для левого
  263. tr = v->left;
  264. v->parent = NULL;
  265. }
  266. }
  267. else
  268. {
  269. if (!v->left)
  270. {//если есть правый ребенок
  271. if (p->left == v) //если удаляемый узел явл. левым ребенком
  272. p->left = v->right; //ребенок удаляемого узла становится левым ребенком своего "деда"
  273. else
  274. p->right = v->right; ////ребенок удаляемого узла становится правым ребенком своего "деда"
  275. v->right->parent = p; //родителем ребенка становится его "дед"
  276. }
  277. else
  278. {//аналогично для левого ребенка
  279. if (p->left == v)
  280. p->left = v->left;
  281. else
  282. p->right = v->left;
  283. v->left->parent = p;
  284. }
  285. delete v;
  286. }
  287. }
  288. else
  289. {//есть оба ребенка
  290. tree *succ = Next(tr, v->inf);//следующий за удаляемым узлом
  291. v->inf = succ->inf; //присваиваем значение
  292. if (succ->parent->left ==succ)
  293. {//если succ левый ребенок
  294. succ->parent->left = succ->right; //его правый ребенок становится левым ребенком своего "деда"
  295. if (succ->right) //если этот ребенок существует
  296. succ->right->parent = succ->parent; //его родителем становится "дед"
  297. }
  298. else
  299. {//аналогично если succ - правый ребенок
  300. succ->parent->right = succ->right;
  301. if (succ->right)
  302. succ->right->parent = succ->parent;
  303. }
  304. delete succ;
  305. }
  306. }
  307.  
  308.  
  309. int main()
  310. {
  311. setlocale(LC_ALL,"RUS");
  312. int n, x;
  313. cout << "n=";
  314. cin >> n;
  315. tree *tr = NULL;
  316. for(int i = 0; i < n; i++) // 10: 65 74 32 1 45 78 69 12 85 36
  317. {
  318. cout << i <<": ";
  319. cin >> x;
  320. if(find(tr, x))
  321. {
  322. cout << "Такой элемент уже есть" << endl;
  323. i--;
  324. }
  325. else
  326. {
  327. insert (tr, x);
  328. }
  329. }
  330. cout << "Прямой обход" << endl;
  331. preorder(tr);
  332. cout << endl;
  333.  
  334. cout << "Обратный обход" << endl;
  335. postorder(tr);
  336. cout << endl;
  337.  
  338. cout << "Симметричный обход" << endl;
  339. inorder(tr);
  340. cout << endl;
  341.  
  342. cout << "min = " << Min(tr)->inf << endl;
  343. cout << "max = " << Max(tr)->inf << endl;
  344. cout << "x = ";
  345. cin >> x;
  346. if (find(tr, x))
  347. {
  348. cout << "Следующий = " << Next(tr, x)->inf << endl;
  349. cout << "Предыдущий = " << Prev(tr, x)->inf << endl;
  350. Delete(tr, find(tr, x));
  351.  
  352. cout << "Прямой обход" << endl;
  353. preorder(tr);
  354. cout << endl;
  355.  
  356. cout << "Обратный обход" << endl;
  357. postorder(tr);
  358. cout << endl;
  359.  
  360. cout << "Симметричный обход" << endl;
  361. inorder(tr);
  362. cout << endl;
  363. }
  364. else
  365. cout << "Такого элемента нет" << endl;
  366. system("pause");
  367. return 0;
  368. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement