Некорректная совместная работа двух функций 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;
}
}
В чём может быть ошибка?