Удаление узла и работа с новым nullptr и связанным узлом

Итак, у меня есть очередь с корневым узлом. У каждого узла есть ребенок или родной брат. Корень может иметь несколько детей, но указывает только на одного ребенок узел. Этот ребенок может иметь детей, но у него также будут другие братья и сестры. Все эти братья и сестры являются потомками корневого узла. И последний ребенок, у которого нет родного брата после него, мы называем родительский узел его родным братом, то есть корнем.

У меня проблема с тем, когда я хочу удалить родительский узел. Я должен перебирать детей, пока не останется ни одного. Если я делаю if (currNode-> sibling), это работает для ВСЕХ ДЕТЕЙ. но я не должен был думать, что это должно нарушить оператор if, если родной брат является корнем. Потому что, прежде чем делать это, я удаляю root. И тогда root = nullptr. Так почему же ребенок, родной брат которого является корнем, все еще указывает на правильное местоположение, а не на nullptr? Благодаря тонну

-2

Решение

Нарисуйте это на бумаге. Родительский узел не может быть братом своего собственного потомка. Так что ваше утверждение, что «последний ребенок, у которого нет родного брата после него, мы называем родительский узел его родным, поэтому корень«просто неправильно. Если вы как-то на самом деле делаете это, прекратите это делать. У последнего узла нет братьев и сестер после него и нет дочерних элементов под ним.

При удалении узла, перекручивание через своих братьев и сестер это неправильно. Вы должны пройти через его дети вместо и только Обновить его ближайшие братья и сестры будут указывать друг на друга, так как теперь они будут новыми братьями и сестрами после завершения удаления.

Попробуйте что-то вроде этого:

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;
}

...
};
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]