我试图使用二叉树中的广度优先搜索来获得特定问题的解决方案。
如果我们将二进制树分成多个层,我将按以下格式进行计算。
扫描根节点
创建其子节点
将子节点的引用添加到队列>在添加了同一层的所有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);
所有这一切都应该有效,但事实并非如此。使用了很多断点和内存扫描我发现了问题,但不知道如何解决它。
基本上。队列中引用对象中的数据由于某种原因而变得笨拙。只有在程序执行启动功能时才会发生此更改。在此之前,所有数据都应该是它应该是什么样的。数据更改为:
绿色部分是根对象引用,其余部分只是giberish。它仅在调用kickoff();
并且第一行运行时更改值。
任何帮助都将不胜感激。
编辑:我忘了做几点:
1)它正确显示根节点的值
2)如果我尝试对队列变量执行任何功能,则值只会更改为不正确。如果我只用正常queue[0]->initCalc();
替换启动函数,这是完全相同的代码但没有for循环,它可以完美地工作。如果我尝试其他任何事情,它只会失败。
答案 0 :(得分:1)
您的递归函数kickoff()
没有基本情况/终止条件。所以它应该永远不会停止。你的工作完成后你应该停止递归调用(即queue
为空,所以不再有孩子推进它。)
还要确保函数getGoal()
从队列中删除第一个元素。如果没有,你最终会一遍又一遍地推动同样的孩子。
处理指针时也可能存在问题,但除非您发布完整的代码,否则无法确保。