我正在编写一个包含BFS的程序。它将在其中每个节点包含一些属性的树上执行BFS。我使用链表来表示树。我的代码很大,因此无法在此处发布。这是我所做的摘要:
在BFS期间,我使用节点类型的队列。
queue <TreeNodes*> my_queue;
和通常的BFS一样,我在队列中推送和弹出节点。在BFS期间,我需要更新树,这意味着我可能会删除一些节点并更新树。
在BFS期间,我发生了分段错误,我知道其原因,但不确定如何解决。
假设在BFS期间我将节点“ x”推入队列。然后,在接下来的迭代中,当我弹出节点“ y”时,我可能会删除仍在队列中的节点“ x”。一旦我弹出“ x”,就会出现问题。
最初,我想如果我通过树中的指针删除此节点,它也会自动将其从队列中删除。但是似乎一旦我将一个节点推送到队列中,它就会推送它的副本。我不确定如何从队列中真正删除它,或者至少从树中删除它后使其变为空。因为它实际上不是null,所以指向无处,并且具有一些随机数作为其属性。
我不知道该搜索什么,所以我在这里问了。
答案 0 :(得分:2)
一种可能性是在树中使用shared_ptr
,在队列中使用weak_ptr
。使用它们并不容易,但是基本思想是shared_ptr
拥有它所指向的内容,而weak_ptr
则具有观察相同事物的能力-但是如果{{ 1}}处理该对象,shared_ptr
会让您知道您要查看的内容已消失,而不是尝试使用现在过时的指针。