Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.34 KB | None | 0 0
  1. template<typename T>
  2. void RBT<T>::del(T key) {
  3.     node<T> *x = this->root;
  4.     while (x) {
  5.         if (x->key == key) {
  6.             break;
  7.         } else if (x->key > key) {
  8.             x = x->left;
  9.         } else {
  10.             x = x->right;
  11.         }
  12.     }
  13.     if (!x->left && !x->right) {// Если нет детей, то просто обнуляем
  14.         if (!x->parent) {// Если нет родителя - то найденный элемент - корень
  15.             this->root = nullptr;
  16.             delete x;
  17.             return;
  18.         } else if (x->parent->left == x) {
  19.             x->parent->left = nullptr;
  20.         } else {
  21.             x->parent->right = nullptr;
  22.         }
  23.         delete x;
  24.         return;
  25.     } else if (!x->left && x->right) {// Если есть только правый ребёнок, то вставляем на место x - правого ребёнка
  26.         if (!x->parent) {
  27.             this->root = x->right;
  28.         } else if (x->parent->left == x) {
  29.             x->parent->left = x->right;
  30.         } else {
  31.             x->parent->right = x->right;
  32.         }
  33.         insert_case1(x->right);
  34.     } else if (x->left && !x->right) {
  35.         // Аналогично с левым
  36.         if (!x->parent) {
  37.             this->root = x->left;
  38.         } else if (x->parent->left == x) {
  39.             x->parent->left = x->left;
  40.         } else {
  41.             x->parent->right = x->left;
  42.         }
  43.         insert_case1(x->left);
  44.     } else {// Если есть оба сына
  45.         node<T> *y = x->right;
  46.         node<T> *z = x;
  47.         while (y) {
  48.             z = y;
  49.             y = y->left;
  50.         }
  51.         x->key = z->key;
  52.         x->data = z->data;
  53.         if (z->right) {// Если у найденного минимума был правый сын, перекидываем с его родителя указатель на правого сына и балансируем
  54.             if (z->parent->left == z) {
  55.                 z->parent->left = z->right;
  56.             } else {
  57.                 z->parent->right = z->right;
  58.             }
  59.             insert_case1(z->right);
  60.         } else {
  61.             if (z->parent->left == z) {
  62.                 z->parent->left = nullptr;
  63.             } else {
  64.                 z->parent->right = nullptr;
  65.             }
  66.         }
  67.     }
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement