Advertisement
Guest User

Untitled

a guest
May 22nd, 2015
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.20 KB | None | 0 0
  1. /* Удаление */
  2. void erase(Key key) {
  3. Node<Key, Value> *node, *p, *child, *pred; child = NULL; //создаются указатели на элемент
  4. node = getNode(root, key); // получаем указатель на элемент по ключу
  5.  
  6. if ( node == NULL ) { // если элемент не был найден, то указатель = NULL
  7. throw "Technique not found.";
  8. }
  9.  
  10. //Удаляем ноду
  11. if(node->left == NULL && node->right == NULL) { //если элемент в дереве НЕ в правой ветке и НЕ в левой ветке
  12. if(node->parent) { // если элемент родитель,то удаляем родителя (корень)
  13. p = node->parent;
  14. } else { // иначе очищаем ДЕРЕВО
  15. delete node;
  16. root = NULL;
  17. return;
  18. }
  19. if(node == p->left) // если элемент находится в левой части, то удаляем его
  20. p->left = NULL;
  21. else
  22. p->right = NULL; // если элемент находится в правой части, то удаляем его
  23. delete node; // удаляем указатель
  24. return;
  25. }
  26.  
  27. //Двое детей. Заменяем их с предшественником и удаляем
  28. if(node->left && node->right) { // если найдено два элементы и они находятся и слева и справа
  29. Pair< Key, Value > ch_pred = predecessorInOrder(node);
  30. pred = getNode(root, ch_pred.getFirst());
  31. if(pred->parent->left == pred)
  32. pred->parent->left = NULL;
  33. else if(pred->parent->right == pred)
  34. pred->parent->right = NULL;
  35. node->data = pred->data;
  36. delete pred;
  37. return;
  38. }
  39.  
  40. // Только один ребенок
  41. // меняем и удаляем
  42. if(node->left)
  43. child = node->left;
  44. else if(node->right)
  45. child = node->right;
  46.  
  47. p = node->parent;
  48. if (p != NULL) {
  49. if(p->left && p->left == node) {
  50. p->left = child;
  51. }
  52. else if (p->right && p->right == node) {
  53. p->right = child;
  54. }
  55. child->parent = p;
  56. }
  57. else {
  58. child->parent = NULL;
  59. root = child;
  60. }
  61. delete node;
  62. return;
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement