2017-08-05 47 views
0

即時通訊工作的項目和我的項目我必須建立一棵樹。樹將有大約64000葉子。不幸的是我一直運行到一個stackoverflow錯誤,我不知道該怎麼做。我寫錯了遞歸方法嗎?還是有錯誤的解決方法? 代碼在構造:建設和巨大的樹,並與stackoverflow錯誤bug

for(int i = 0; i < wordHolder.size(); i++) { 
      add(i); 
     } 

添加方法:

public void add(int i){ 
     mainTreeNode = treeSetup(mainTreeNode, 0, wordHolder.get(i), countHolder.get(i)); 
    } 

和,設置了樹的遞歸方法:

private TreeNode treeSetup(TreeNode node, int letterCount, String s, List<Integer> i) { 
     if(letterCount == 26) { 
      letterCount = 0; 
     } 
     if(node == null) { 
      node = new TreeNode(s,i); 
     } else if (i.get(letterCount) >= node.test.get(letterCount)) { 
      node.right = treeSetup(node.right, letterCount++, s, i); 
     } else if(i.get(letterCount) < node.test.get(letterCount)) { 
      node.left = treeSetup(node.left, letterCount++, s, i); 
     } 
     return node; 
    } 

節點是包含2層數據結構標準節點(一個列表和一個字符串)。這個想法是節點根據列表包含的內容放入一個位置。此外,樹中的每個級別都根據與列表不同的值進行檢查(如KD樹),因此是letterCount變量。問題似乎在

node.right = treeSetup(node.right, letterCount++, s, i);` 

行,但基於「if語句」具有「=」符號的更改。如果我從兩個「if語句」中刪除「=」符號,問題就消失了,但我失去了大量的準確性。請幫助

回答

0

這是Java嗎?你沒有指定,但它看起來像。除了最佳實踐問題之外,我看到的其中一件事是2,如果是的話,如果你應該做的話,如果你還有其他問題,那麼你應該這樣做。然而,對於這項研究,案例切換可能會更好。

構造函數應該有for循環。構造函數應該是一個藍圖,您可以調用它來構建對象的實例。它只是提供給你一個框架的所有參考和信息。然後你用其他方法給它一些肉。

我個人想要嘗試的第一件事就是讓Treenode treeSetup更像構造函數實例的初始值設定項。讓它獲取參數並將它們傳遞給需要它們來設置其唯一性的對象實例。將for循環放入void方法中,建立Params以傳遞給虛空內的Treenode方法,然後將所有信息傳遞給它,並讓它爲你設置所有的好東西。

爲節點本身有更好的方法可以做到這一點,但快速和骯髒的

if (letterCount == 26) { 
letterCount = 0; 
} 
if (node != null) { 
if (letterCount %2 == 0) { 
do left stuff 
} else { 
do right stuff 
} 
} 
return 

否則,如果作品,但說實話,如果你能找到一種方法,用枚舉或開關的情況下,大部分的設置更現代。 你應該看的另一件事是,你正在以一種奇怪的方式使用2種數據類型,對於包含一個鍵和一個值的2種數據類型,已經有一個完美的項目。

https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

+0

但是,現在爲我解決這個stackoverflow問題? –

+0

另外,我必須使用kd樹,問題要大得多,kd樹是解決它的方法(它的基於相似性) –