Некорректная совместная работа двух функций C++

Программа работает с Generic Tree. Две функции: удаление узла и добавление нового - вместе работают некорректно. Так, при удалении (замене) узла, я не смогу добавить ему новый дочерний узел. Программа крашится.

struct Node
{
    int key = 0; //ключ
    int id = 0; //индекс
    int level = 0; //уровень в иерархии
    Node* parent = nullptr; //указатель на родителя
    Node** son = nullptr; //массив указателей на сыновей
    int count_son = 0; //количество сыновей
};

Функции на самом деле побольше, чем тут. Я их специально сократил, остальная часть работает нормально. Рассматриваем удаление узлов, потомков у которых > 1.

Функция удаления (на самом деле заменяет удаляемый узел на его самый левый дочерний узел):

Node* nodeAdd(Node* node, int key, int keykey)
{
    if (DelNode->count_son > 1)
    {
        NewNode = DelNode->son[0];
        NewNode->level = DelNode->level;
        NewNode->id = DelNode->id;
        for (int i = 0; i < ParentNode->count_son; i++)
        {
            ParentNode->son[i] = NewNode;
            break;
        }
        NewNode->parent = ParentNode;// указателю родителя дочернего узла присваиваем адрес родительского узла удаляемого элемента теперь удаляемый элемент исключен из дерева и как бы висит в воздухе вместе с потомками, кроме самого левого
        // нужно оставшихся потомков перепривязать к новому узлу
        Node** tmp = new Node * [NewNode->count_son + DelNode->count_son - 1];
        for (int j = 0; j < NewNode->count_son; j++)
            tmp[j] = NewNode->son[j];

        for (int j = 1; j < DelNode->count_son; j++) // копируем все указатели на потомков из удаляемого узла в новый массив нового узла
            tmp[NewNode->count_son + j - 1] = DelNode->son[j];

        delete[] NewNode->son; // удаляем старый массив указателей на потомков
        NewNode->son = tmp; // запоминаем новый массив указателей 
        NewNode->count_son = DelNode->count_son - 1; // сохраняем новое количество потомков
        for (int i = 0; i < NewNode->count_son; i++)
            NewNode->son[i]->level--;

        // Теперь удаляем старый узел
        delete[] DelNode->son; // сначала удаляем массив указателей на потомков
        delete DelNode;
        return true;
    }
    return false;
}

Функция добавления дочернего узла:

Node* nodeAdd(Node* node, int key, int keykey)
{
 if (found->count_son > 0) 
{
    auto found = Find(node, key);
    Node* NewNode = new Node;
    Node* NewNode = new Node;
    NewNode->parent = found;
    NewNode->son = NULL;
    NewNode->key = keykey;
    NewNode->level = found->level + 1;
    NewNode->id = found->son[found->count_son - 1]->id + 1;
    found->count_son++;
    return NewNode;
}
}

В чём может быть ошибка?


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