我正在嘗試使用二進制樹中的寬度優先搜索來獲取特定問題的解決方案。對象中的所有值都溢出
如果我們將二叉樹分爲幾層,我按照以下格式進行計算。
掃描根節點
創建它的子節點
添加子節點的參考到隊列>所有由相同的層相鄰的子節點之後已被添加,掃描每個他們並重復
所以,我對於嘗試代碼
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循環,它可以很好地工作。它只會失敗,如果我嘗試別的。
您可能正在訪問數組的界限,和/或使用野指針。無法肯定地說,除非你發佈[MCVE](http://stackoverflow.com/help/mcve)。爲了避免這些問題,請停止使用原始指針並停止使用C風格的數組。 –
儘快嘗試併發布我的代碼的MCVE,但我不認爲這是這種情況,因爲1)它正確地顯示根節點的值,2)如果我嘗試執行任何函數,值只會更改爲不正確在隊列變量上。如果我只是用正常的'queue [0] - > initCalc();'代替完全相同的代碼,但沒有for循環的啓動函數,它完美的工作。它只會失敗,如果我嘗試其他任何東西.. – shadoweye14