Итак, у меня есть очередь с корневым узлом. У каждого узла есть ребенок или родной брат. Корень может иметь несколько детей, но указывает только на одного ребенок узел. Этот ребенок может иметь детей, но у него также будут другие братья и сестры. Все эти братья и сестры являются потомками корневого узла. И последний ребенок, у которого нет родного брата после него, мы называем родительский узел его родным братом, то есть корнем.
У меня проблема с тем, когда я хочу удалить родительский узел. Я должен перебирать детей, пока не останется ни одного. Если я делаю if (currNode-> sibling), это работает для ВСЕХ ДЕТЕЙ. но я не должен был думать, что это должно нарушить оператор if, если родной брат является корнем. Потому что, прежде чем делать это, я удаляю root. И тогда root = nullptr. Так почему же ребенок, родной брат которого является корнем, все еще указывает на правильное местоположение, а не на nullptr? Благодаря тонну
Нарисуйте это на бумаге. Родительский узел не может быть братом своего собственного потомка. Так что ваше утверждение, что «последний ребенок, у которого нет родного брата после него, мы называем родительский узел его родным, поэтому корень«просто неправильно. Если вы как-то на самом деле делаете это, прекратите это делать. У последнего узла нет братьев и сестер после него и нет дочерних элементов под ним.
При удалении узла, перекручивание через своих братьев и сестер это неправильно. Вы должны пройти через его дети вместо и только Обновить его ближайшие братья и сестры будут указывать друг на друга, так как теперь они будут новыми братьями и сестрами после завершения удаления.
Попробуйте что-то вроде этого:
struct node
{
node *parent;
node *children;
node *previous;
node *next;
...
node() :
parent(0), children(0), previous(0), next(0), ...
{}
~node()
{
unlink();
while (children)
delete children;
}
void unlink()
{
if (previous)
previous->next = next;
if (next)
next->previous = previous;
if ((parent) && (parent->children == this))
parent->children = next;
parent = next = previous = 0;
}
void addChild(node *child)
{
child->unlink();
child->parent = this;
if (children)
{
node *t = children;
while (t->next)
t = t->next;
child->previous = t;
t->next = child;
}
else
children = child;
}
...
};
class myqueue
{
private;
node *root;
...
public:
myqueue() :
root(new node)
{}
~myqueue()
{
delete root;
}
void addChild(node *parent = 0)
{
node n = new node;
if (!parent)
parent = root;
parent->addChild(node);
}
void remove(node *n)
{
delete n;
}
...
};
Других решений пока нет …