Advertisement
aaarrtem

Treeee

Mar 26th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.91 KB | None | 0 0
  1. #include <ctime>
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. typedef int T;
  6. struct TreeNode
  7. {
  8. T key; // ключ/данные
  9. TreeNode *left; // указатель на левого потомка
  10. TreeNode *right; // указатель на правого потомка
  11. TreeNode *parent; // указатель на предка
  12. };
  13.  
  14. TreeNode *node(int x)
  15. {
  16. TreeNode *n = new TreeNode;
  17. n->key = x;
  18. n->left = n->right = NULL;
  19. n->parent = NULL;
  20. return n;
  21. }
  22.  
  23. void inorderTraversal(TreeNode* root) //обход узлов в отсортированном порядке
  24. {
  25. if (root == NULL)
  26. {
  27. return;
  28. }
  29. inorderTraversal(root->left);
  30. cout << root->key << " ";
  31. inorderTraversal(root->right);
  32. }
  33.  
  34. void preorderTraversal(TreeNode* root) //обход узлов в порядке: вершина, левое поддерево, правое поддерево
  35. {
  36. if (root == NULL)
  37. {
  38. return;
  39. }
  40. cout << root->key << " ";
  41. preorderTraversal(root->left);
  42. preorderTraversal(root->right);
  43. }
  44.  
  45. void postorderTraversal(TreeNode *root) //обход узлов в порядке: левое поддерево, правое поддерево, вершина
  46. {
  47. if (root == NULL)
  48. {
  49. return;
  50. }
  51. postorderTraversal(root->left);
  52. postorderTraversal(root->right);
  53. cout << root->key << " ";
  54. }
  55.  
  56. TreeNode search(TreeNode* root, int k)
  57. {
  58. if ((root == NULL) || (k == root->key))
  59. {
  60. return *root;
  61. }
  62. if (k < root->key)
  63. {
  64. return search(root->left, k);
  65. }
  66. else
  67. {
  68. return search(root->right, k);
  69. }
  70. }
  71.  
  72. void insert(TreeNode *&root, int z)
  73. {
  74. TreeNode *n = node(z);
  75. if (!root)
  76. {
  77. root = n;
  78. }
  79. else
  80. {
  81. TreeNode *y = root;
  82. while (y)
  83. {
  84. if (n->key > y->key)
  85. {
  86. if (y->right)
  87. {
  88. y = y->right;
  89. }
  90. else
  91. {
  92. n->parent = y;
  93. y->right = n;
  94. break;
  95. }
  96. }
  97. else
  98. {
  99. if (n->key < y->key)
  100. {
  101. if (y->left)
  102. {
  103. y = y->left;
  104. }
  105. else
  106. {
  107. n->parent = y;
  108. y->left = n;
  109. break;
  110. }
  111. }
  112. }
  113. }
  114. }
  115. }
  116.  
  117. TreeNode* minimum(TreeNode* root)
  118. {
  119. if (root->left == NULL)
  120. return root;
  121. return minimum(root->left);
  122. }
  123. TreeNode* maximum(TreeNode* root)
  124. {
  125. if (root->right == NULL)
  126. return root;
  127. return maximum(root->right);
  128. }
  129.  
  130. TreeNode* next(TreeNode* root)
  131. {
  132. if (root->right != NULL)
  133. return minimum(root->right);
  134. TreeNode* y = root->parent;
  135. while (y != NULL && root == y->left)
  136. {
  137. root = y;
  138. y = y->parent;
  139. }
  140. return y;
  141. }
  142. void _delete(TreeNode* t, TreeNode* v)
  143. {
  144. TreeNode *p = v->parent;
  145. if (v->left == NULL && v->right == NULL)
  146. {
  147. if (p->left == v)
  148. p->left = NULL;
  149. if (p->right == v)
  150. p->right = NULL;
  151. }
  152. else if (v->left == NULL || v->right == NULL)
  153. {
  154. if (v->left == NULL)
  155. {
  156. if (p->left == v)
  157. {
  158. p->left = p->right;
  159. }
  160. else
  161. {
  162. p->right = p->left;
  163. v->right->parent = p;
  164. }
  165. }
  166. else
  167. {
  168. if (p->left == v)
  169. {
  170. p->left = v->left;
  171. }
  172. else
  173. {
  174. p->right = v->left;
  175. v->left->parent = p;
  176. }
  177. }
  178. }
  179. else
  180. {
  181. TreeNode* successor = next(t);
  182. v->key = successor->key;
  183. if (successor->parent->left == successor)
  184. {
  185. successor->parent->left = successor->right;
  186. if (successor->right != NULL)
  187. {
  188. successor->right->parent = successor->parent;
  189. }
  190. }
  191. else
  192. {
  193. successor->parent->right = successor->right;
  194. if (successor->right != NULL)
  195. {
  196. successor->right->parent = successor->parent;
  197. }
  198. }
  199. }
  200. }
  201.  
  202. int main()
  203. {
  204. TreeNode *tree = NULL;
  205. int n;
  206. cout << "Enter amount keys: ";
  207. cin >> n;
  208. srand(time(0));
  209. for (int i = 0; i < n; i++)
  210. {
  211. int x;
  212. x = rand() % 20;
  213. insert(tree, x);
  214. }
  215. cout << "Inorder: ";
  216. inorderTraversal(tree);
  217. cout <<endl;
  218. cout << "Preorder: ";
  219. preorderTraversal(tree);
  220. cout << endl;
  221. cout << "Postorder: ";
  222. postorderTraversal(tree);
  223. cout << endl;
  224. system("pause");
  225. return 0;
  226. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement