给定一个排序数组,将其转换为Java中的二进制搜索树(Leetcode问题)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
if(nums.length == 0) {return null;}
TreeNode ans = helper(nums, 0, nums.length);
return ans;
}
public TreeNode helper(int [] nums, int start, int end){
int mid = start + (end - start)/2;
if(start == end){
TreeNode lastNode = new TreeNode(nums[start]);
lastNode.right = null;
lastNode.left = null;
return lastNode;
}
int mi = nums[mid];
TreeNode newNode = new TreeNode(mi);
TreeNode left = helper(nums, start, mid - 1);
TreeNode right = helper(nums, mid + 1, end);
newNode.left = left;
newNode.right = right;
return newNode;
}
}
我在第一行得到了一个stackoverflower:
TreeNode left = helper(nums, start, mid - 1);
但我不明白为什么会收到错误?
我使用示例数组尝试了它:[1, 2, 3]
我得到了错误。 有人可以帮我解释为什么会这样吗?
答案 0 :(得分:0)
那是因为条件(start == end)没有发生,递归仍在调用
尝试制作它(nums.length -1)而不是nums.length
答案 1 :(得分:0)
我已经修改了代码以使其正常运行。首先,我没有对封闭的TreeMode
类进行注释,并将Solution
作为内部类。然后由于编译错误,我从类声明中删除了public
关键字。
我为TreeNode
构造函数添加了更多参数。要创建名为TreeNode
的{{1}}对象,类root
的方法new
内部的helper
运算符将使用三个参数调用构造函数。在Solution
方法内添加了if
条件,以避免helper
。
并将Memory Limit Exceeded
参数更改为nums.length
。正如Fady Saad正确提及的那样。
一种算法需要从数组中间获取元素,并将其作为根节点。然后,将数组分为左侧和右侧。表格左侧的中央元素变为左侧节点,表格右侧的中央元素变为右侧节点。
要深入了解和分析,可以对其进行调试。
nums.length-1