2015-12-03 80 views
-1

我正在嘗試使用二進制樹中的寬度優先搜索來獲取特定問題的解決方案。對象中的所有值都溢出

如果我們將二叉樹分爲幾層,我按照以下格式進行計算。

掃描根節點

創建它的子節點

添加子節點的參考到隊列>所有由相同的層相鄰的子節點之後已被添加,掃描每個他們並重復

所以,我對於嘗試代碼

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

您可能正在訪問數組的界限,和/或使用野指針。無法肯定地說,除非你發佈[MCVE](http://stackoverflow.com/help/mcve)。爲了避免這些問題,請停止使用原始指針並停止使用C風格的數組。 –

+0

儘快嘗試併發布我的代碼的MCVE,但我不認爲這是這種情況,因爲1)它正確地顯示根節點的值,2)如果我嘗試執行任何函數,值只會更改爲不正確在隊列變量上。如果我只是用正常的'queue [0] - > initCalc();'代替完全相同的代碼,但沒有for循環的啓動函數,它完美的工作。它只會失敗,如果我嘗試其他任何東西.. – shadoweye14

回答

1

您的遞歸函數kickoff()沒有基本大小寫/終止條件。所以它永遠不會停止。當你的工作完成時,你應該停止遞歸調用(即queue爲空,所以沒有更多的孩子推動它)。

還要確保功能getGoal()從隊列中刪除第一個元素。如果不這樣做,你最終會一遍又一遍地推動同樣的孩子。

處理指針也可能存在問題,但除非您發佈完整的代碼,否則無法保證。

+0

遞歸函數確實有一個終止代碼片段,在循環內的'返回'。它會檢查每個節點,使它與答案的目標狀態相匹配,然後纔會終止。爲了防止重複,我改爲在計算狀態時切換的每個狀態都添加一個布爾值。 – shadoweye14

+0

一般來說,遞歸應該以避免它的一些基本情況爲條件,並且有不同的(和「縮小」)參數 –

相關問題