Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- AvlTree::node* AvlTree::node::remove(int key)
- {
- if (!this) return nullptr;
- if (key < this->key)//если искомое значение меньше ключа
- {
- this->left = this->left->remove(key);//рекурсивный перебор левого дерева
- }
- else if (key > this->key)//если искомое значение больше ключа
- {
- this->right = this->right->remove(key);//рекурсивный перебор правого дерева
- }
- else // if(k == p->key) значение для удаления найдено, оно в текущем узле
- {
- node* q = this->left; //сохраняем для объединения левую и правую ветви
- node* r = this->right;
- delete this; //удаляем узел
- if (!r)return q; //если ветви справа не существует, то возвращаем левую ветвь ВСЁ, ЧТО МЫ ВОЗВРАЩАЕМ МЫ ВЕРХНИХ БЛОКАХ IF ELSE ПРИСВАЕМАЕМ К ПРАВОЙ ИЛИ ЛЕВОЙ ВЕТВИ
- node* min = r->find_min(); //находим минимальное значение в левой ветви, посути это вообще самое минимальное значение в дереве
- min->right = remove_min(); //посути мы выпрямляем веточку, чтобы потом было проще её сбалансировать
- min->left = q; //присваиваем левую ветвь на левую ветвь минимального значения
- return min->balance(); //выполняем балансировку ветки, которую мы сейчас склеивали
- }
- return this->balance();//выполняем балансировку всего дерева
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement