Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Удаление */
- void erase(Key key) {
- Node<Key, Value> *node, *p, *child, *pred; child = NULL; //создаются указатели на элемент
- node = getNode(root, key); // получаем указатель на элемент по ключу
- if ( node == NULL ) { // если элемент не был найден, то указатель = NULL
- throw "Technique not found.";
- }
- //Удаляем ноду
- if(node->left == NULL && node->right == NULL) { //если элемент в дереве НЕ в правой ветке и НЕ в левой ветке
- if(node->parent) { // если элемент родитель,то удаляем родителя (корень)
- p = node->parent;
- } else { // иначе очищаем ДЕРЕВО
- delete node;
- root = NULL;
- return;
- }
- if(node == p->left) // если элемент находится в левой части, то удаляем его
- p->left = NULL;
- else
- p->right = NULL; // если элемент находится в правой части, то удаляем его
- delete node; // удаляем указатель
- return;
- }
- //Двое детей. Заменяем их с предшественником и удаляем
- if(node->left && node->right) { // если найдено два элементы и они находятся и слева и справа
- Pair< Key, Value > ch_pred = predecessorInOrder(node);
- pred = getNode(root, ch_pred.getFirst());
- if(pred->parent->left == pred)
- pred->parent->left = NULL;
- else if(pred->parent->right == pred)
- pred->parent->right = NULL;
- node->data = pred->data;
- delete pred;
- return;
- }
- // Только один ребенок
- // меняем и удаляем
- if(node->left)
- child = node->left;
- else if(node->right)
- child = node->right;
- p = node->parent;
- if (p != NULL) {
- if(p->left && p->left == node) {
- p->left = child;
- }
- else if (p->right && p->right == node) {
- p->right = child;
- }
- child->parent = p;
- }
- else {
- child->parent = NULL;
- root = child;
- }
- delete node;
- return;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement