2012-08-10 200 views
0

我是一個初學者,我只是試圖首次實現一個,並且正在生成stackoverflow。我知道它可能與一個不好的遞歸調用有關,但是我沒有看到遞歸有什麼問題,我可以得到一些幫助嗎?錯誤是在這個代碼中。這是爲什麼產生一個StackOverflowError

 public void insert(Node node, String value) 
{ 
    if((value.compareTo(node.getValue())) < 0) 
    { 
     if (node.left != null) 
     { 
      insert(node.left, value); 
     } 
     else 
      node.left = new Node(value); 

    } 
    else if((value.compareTo(node.getValue())) > 0) 
    { 
     if(node.right !=null) 
     { 
      insert(node.right, value); 
     } 
     else 
      node.right= new Node(value); 
    } 
} 

我打電話這裏

public static void main(String[] args) throws FileNotFoundException, IOException { 
    Tree dataTree = new Tree(new Node("m")); 


    File file = new File("C:\\randomdata.csv"); 

    BufferedReader br = new BufferedReader(new FileReader(file)); 
    String line; 

    while((line = br.readLine()) != null){ 
     if(line.toString().contains("zogeti")) 
      break; 
     else 
     { 
      dataTree.insert(dataTree.getRootElement(),line); 
     } 
    } 

    br.close(); 
    } 
+0

randomdata.csv中有多少行,並且是以任何特定順序的行? – xvtk 2012-08-10 23:26:14

+0

該文件是3260953行,他們最初排序,然後重複5次。我能夠做我想做的事情,使用array和arraylist我想用二叉樹來做,所以我可以比較效率時間 – 2012-08-10 23:45:29

+0

對於已經排序的內容,簡單的二叉樹具有最壞情況的行爲。看聖經(即;克努特),並嘗試平衡的樹木。 – ddyer 2012-08-10 23:58:07

回答

1

如果該文件最初排序,那麼這個功能看起來會重複N次 有N行的文件。 Java沒有實現尾遞歸,所以這肯定是一個真正的 遞歸。將其重寫爲while循環而不是遞歸函數。

0

這種方法這將最有可能發生,如果node.left == nodenode.right == node或者在你的樹其他一些較長的週期。

在它的當前形式中,如果值相等,它將不會觸發,如果阻塞,並且會簡單地返回(並返回跟蹤,以及)沒有添加任何東西。這意味着該循環可能發生在這種方法之外。

您可能會在插入方法之外的其他地方發現此錯誤:您的Tree類的構造函數。

0

此CSV文件有多大?文件越大,遞歸越深,導致計算器翻轉。

嘗試使用以下命令行參數執行java。

-Xms512m -Xmx512m 

另外,如果從文件中讀取的新行與現有節點值相同,該怎麼辦?

以下代碼將忽略該...(可能是一個要求,我只是說)。

if((value.compareTo(node.getValue())) < 0) 
{ 
    if (node.left != null) 
    { 
     insert(node.left, value); 
    } 
    else 
     node.left = new Node(value); 

} 
else if((value.compareTo(node.getValue())) > 0) 
{ 
    if(node.right !=null) 
    { 
     insert(node.right, value); 
    } 
    else 
     node.right= new Node(value); 
} 
0

如果你的文件是3260953行,並排序,肯定會解釋你的問題。如果元素按升序排序,則每當insert插入一個新元素時,它就會每次放在每個節點的右側分支上。你最終得到的是你的代碼通過多次遞歸調用訪問的3260953個線性鏈接節點的字符串。這會使堆棧溢出。嘗試在更小的文件上以亂碼字母順序運行。

紅黑樹通過重新分佈元素自動平衡樹來避免此問題。然而,編制這樣的數據結構並不是那麼直截了當。

相關問題