Балансировка АВЛ-дерева (в функции deleteNodeHelper на algorithmtutor.com)

Мне нравится реализация АВЛ-дерева на algorithmtutor (код на C++ здесь).

Но авторы оставили часть кода незавершённым: в функции deleteNodeHelper нет балансировки. Я пытался вставить updateBalance в разные места кода, но прога всё время крашится.

Помогите, пожалуйста, кто шарит, дописать функцию... Я уже не знаю, что ещё сделать.

    NodePtr deleteNodeHelper(NodePtr node, int key) {
        // search the key
        if (node == nullptr) return node;
        else if (key < node->data) { node->left = deleteNodeHelper(node->left, key); }
        else if (key > node->data) { node->right = deleteNodeHelper(node->right, key); }
        else {
            // the key has been found, now delete it

            // case 1: node is a leaf node
            if (node->left == nullptr && node->right == nullptr) {
                delete node;
                node = nullptr;
            }

            // case 2: node has only one child
            else if (node->left == nullptr) {
                NodePtr temp = node;
                node = node->right;
                delete temp;
            }

            else if (node->right == nullptr) {
                NodePtr temp = node;
                node = node->left;
                delete temp;
            }

            // case 3: has both children
            else {
                NodePtr temp = minimum(node->right);
                node->data = temp->data;
                node->right = deleteNodeHelper(node->right, temp->data);
            }
        } 


        // Write the update balance logic here 
        // YOUR CODE HERE

        return node;
    }

P.S. Я пытался:

  1. Добавить updateBalance(node); перед финальным return.

  2. Аналогично, но с добавлением return node; в case 1 и case 2.

  3. Добавить updateBalance(node); в ветки (key < node->data) и (key > node->data)...

Результат – краш.


Ответы (0 шт):