Advertisement
Hamikadze

Untitled

Nov 11th, 2018
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.78 KB | None | 0 0
  1. AvlTree::node* AvlTree::node::remove(int key)
  2. {
  3.     if (!this) return nullptr;
  4.     if (key < this->key)//если искомое значение меньше ключа
  5.     {
  6.         this->left = this->left->remove(key);//рекурсивный перебор левого дерева
  7.     }
  8.     else if (key > this->key)//если искомое значение больше ключа
  9.     {
  10.         this->right = this->right->remove(key);//рекурсивный перебор правого дерева
  11.     }
  12.     else // if(k == p->key) значение для удаления найдено, оно в текущем узле
  13.     {
  14.         node* q = this->left; //сохраняем для объединения левую и правую ветви
  15.         node* r = this->right;
  16.         delete this; //удаляем узел
  17.         if (!r)return q; //если ветви справа не существует, то возвращаем левую ветвь ВСЁ, ЧТО МЫ ВОЗВРАЩАЕМ МЫ ВЕРХНИХ БЛОКАХ IF ELSE ПРИСВАЕМАЕМ К ПРАВОЙ ИЛИ ЛЕВОЙ ВЕТВИ
  18.         node* min = r->find_min(); //находим минимальное значение в левой ветви, посути это вообще самое минимальное значение в дереве
  19.         min->right = remove_min(); //посути мы выпрямляем веточку, чтобы потом было проще её сбалансировать
  20.         min->left = q; //присваиваем левую ветвь на левую ветвь минимального значения
  21.         return min->balance(); //выполняем балансировку ветки, которую мы сейчас склеивали
  22.     }
  23.     return this->balance();//выполняем балансировку всего дерева
  24. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement