对象中的所有值都溢出

时间:2015-12-03 05:31:39

标签: c++

我试图使用二叉树中的广度优先搜索来获得特定问题的解决方案。

如果我们将二进制树分成多个层,我将按以下格式进行计算。

  

扫描根节点

     

创建其子节点

     

将子节点的引用添加到队列>在添加了同一层的所有ADJACENT子节点之后,扫描每个子节点并重复

所以我的代码是

void kickoff() {
    unsigned int size = queue.size();
    for (unsigned int i = 0; i < size;i++) {
        if (queue[i]->getGoal()) {
            //Print Solution on CLI
            return;
        }
        queue[i]->verGoal();
        queue[i]->initCalc(); //Create the Next Layer of Child Nodes..
    }
    kickoff(); //Recursive Loop
}

这个函数基本上会检查每个层,从根层开始,到二叉树的解决方案层,正确实现BFS。

队列就是这样的

vector<state*> queue;

使用队列中每个状态的initCalc();函数计算子节点后,它们的引用将自动添加到队列中。

状态对象将是这样的

vector<state*>* queue;
//Calculate Child Nodes here
queue->push_back(&childNode);

所有这一切都应该有效,但事实并非如此。使用了很多断点和内存扫描我发现了问题,但不知道如何解决它。

基本上。队列中引用对象中的数据由于某种原因而变得笨拙。只有在程序执行启动功能时才会发生此更改。在此之前,所有数据都应该是它应该是什么样的。数据更改为:

enter image description here

绿色部分是根对象引用,其余部分只是giberish。它仅在调用kickoff();并且第一行运行时更改值。

任何帮助都将不胜感激。

编辑:我忘了做几点:

1)它正确显示根节点的值

2)如果我尝试对队列变量执行任何功能,则值只会更改为不正确。如果我只用正常queue[0]->initCalc();替换启动函数,这是完全相同的代码但没有for循环,它可以完美地工作。如果我尝试其他任何事情,它只会失败。

1 个答案:

答案 0 :(得分:1)

您的递归函数kickoff()没有基本情况/终止条件。所以它应该永远不会停止。你的工作完成后你应该停止递归调用(即queue为空,所以不再有孩子推进它。)

还要确保函数getGoal()从队列中删除第一个元素。如果没有,你最终会一遍又一遍地推动同样的孩子。

处理指针时也可能存在问题,但除非您发布完整的代码,否则无法确保。