2015-10-14 81 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