我正在编写一个包含BFS的程序。它将在每个节点都包含一些属性的树上执行BFS。我用链表来表示树。我的代码很大,我不能在这里发布。这是我所做工作的总结:
在BFS期间,我使用节点类型的队列。
queue <TreeNodes*> my_queue;
和通常的BFS一样,我在队列中推送和弹出节点。在BFS期间,我需要更新树,这意味着我可能会删除一些节点并更新树。
在BFS期间,我出现了分段故障,我知道它的原因,但不知道如何解决它
假设在BFS期间,我将节点"x"推入队列。然后在接下来的迭代中,当我弹出节点"y"时,我可能会删除节点"x",而它仍在队列中。一旦我弹出"x",这就成了一个问题。
最初,我想如果通过树中的指针删除这个节点,它也会自动将其从队列中删除。但似乎一旦我把一个节点推到队列中,它就会推送它的副本。我不确定如何才能真正从队列中删除它,或者至少当我从树中删除它时,它就会变为空。因为它实际上不是空的,指向任何地方,并且有一些随机数作为它的属性。
我不知道我应该搜索什么,所以我在这里问它。
一种可能性是在树中使用shared_ptr
s,在队列中使用weak_ptr
s。使用它们在某种程度上是不平凡的,但基本思想是shared_ptr
拥有它所指向的东西的所有权,而weak_ptr
能够观察相同的东西——但如果shared_ptr
处理了对象,weak_ptr
会让你知道你试图查看的东西已经消失,而不是试图使用一个现在已经过时的指针。