2015-10-14 82 views
1

當我調用這個函數時,爲什麼會出現一個stackoverflow錯誤? 我檢查了我的終端條件,但無法弄清楚問題出在哪裏。關於遞歸函數的Java stackoverflow錯誤

public static TreeNode buildTree(int t1, int t2, ListNode[] nodeArray) {  
    if(t1 == t2){ 
     TreeNode temp = new TreeNode(nodeArray[t1].val); 
     temp.left = null; 
     temp.right = null; 
     return temp; 
    } 
    else if(t1 > t2){ 
     return null; 
    } 

    else{ 
     TreeNode root = new TreeNode(nodeArray[(t1+t2)/2].val); 
     root.left = buildTree(0,(t1+t2)/2-1,nodeArray); 
     root.right = buildTree((t1+t2)/2+1,nodeArray.length-1,nodeArray); 
     return root; 
    } 
} 
+1

你如何調用此方法? – npinti

+0

最有可能的情況是,你總是進入你的條件的其他部分,並以「buildTree」的無盡呼喚結束。 – SomeJavaGuy

回答

6

它看起來像遞歸方法應該是工作在t1t2的範圍內,所以遞歸調用應該是:

root.left = buildTree(t1,(t1+t2)/2-1,nodeArray); 
root.right = buildTree((t1+t2)/2+1,t2,nodeArray); 

您當前的遞歸調用永遠不會縮小範圍(你總是傳遞一個範圍從0到中間,另一個範圍從nodeArray的中間到結尾),所以遞歸永遠不會結束。

+0

它的作品,謝謝! – Eric

0

這只是調試101

將下面的行作爲方法的第一個:

System.out.println("Entry, t1 = " + t1 + ", t2 = " + t2); 

從這一點,你就可以制定出流。

0

呼叫你的方法以與陣列[0,1,2,3,4]等buildTree(0,4,陣列)的簡單的例子:

1 root = 2; 
2 buildTree(0, 1); 
3  root = 0; 
4  buildTree(0, -1); 
5   null; 
6  buildTree(1, 4); 
7   root = 2; 
8   buildTree(0, 1); // endless recursion. see 2nd line call