Из описания, которое вы дали для древовидной структуры, которую вы реализуете, может быть лучше создать новую структуру данных для имитации вашего дерева.Особенно, если вы уже отслеживаете указатели между узлами.
Если я понимаю ваше утверждение, каждый узел в вашем дереве будет содержать вектор дочерних указателей на узлы.Когда вам нужно разделить узел, вы можете создать новые узлы, каждый из которых получает сегмент вектора дочерних указателей, и вновь созданные узлы будут вставлены в вектор узла родительского узла.
дляпример:
N1->N2->(n3,n4,n5,n6,n7,n8)
разделить N2 на два узла: N1->(N2_1, N2_2)
с N2_1->(n3,n4,n5)
и N2_2->(n6,n7,n8)
(Извините, я не знаю, как легко рисовать деревья ...)
Таким образом, вы только перезаписываете память, а не копируете, и доступ, как правило, будет log n.Кроме того, это дает правильное представление древовидной структуры в коде.
edit, добавление примера:
Предположим, снова у нас есть N1->N2->(n3,n4,n5,n6,n7,n8)
.Если N1 необходимо добавить новые узлы, единственное влияние - на узел N1: N1->(N2,N9)->(n3,n4,n5,n6,n7,n8)
Структура узла может быть такой (очень упрощенной):
class Node {
vector<Node *> children;
Node * parent;
};
Более крупная древовидная структура будет состоять из множества узлов, очень похожих на двоичное дерево.Чтобы добавить узлы к любому узлу в дереве, нужно добавить только элементы к члену children
этого узла.Ничего другого не затронуто.