如何在BFS(C ++)期间删除队列中的obj?

时间:2018-07-11 21:49:14

标签: c++ linked-list tree breadth-first-search

我正在编写一个包含BFS的程序。它将在其中每个节点包含一些属性的树上执行BFS。我使用链表来表示树。我的代码很大,因此无法在此处发布。这是我所做的摘要:

在BFS期间,我使用节点类型的队列。

queue <TreeNodes*> my_queue;

和通常的BFS一样,我在队列中推送和弹出节点。在BFS期间,我需要更新树,这意味着我可能会删除一些节点并更新树。

在BFS期间,我发生了分段错误,我知道其原因,但不确定如何解决。

假设在BFS期间我将节点“ x”推入队列。然后,在接下来的迭代中,当我弹出节点“ y”时,我可能会删除仍在队列中的节点“ x”。一旦我弹出“ x”,就会出现问题。

最初,我想如果我通过树中的指针删除此节点,它也会自动将其从队列中删除。但是似乎一旦我将一个节点推送到队列中,它就会推送它的副本。我不确定如何从队列中真正删除它,或者至少从树中删除它后使其变为空。因为它实际上不是null,所以指向无处,并且具有一些随机数作为其属性。

我不知道该搜索什么,所以我在这里问了。

1 个答案:

答案 0 :(得分:2)

一种可能性是在树中使用shared_ptr,在队列中使用weak_ptr。使用它们并不容易,但是基本思想是shared_ptr拥有它所指向的内容,而weak_ptr则具有观察相同事物的能力-但是如果{{ 1}}处理该对象,shared_ptr会让您知道您要查看的内容已消失,而不是尝试使用现在过时的指针。