在Java中将排序数组转换为二叉树

时间:2017-04-01 09:41:24

标签: java arrays

给定一个排序数组,将其转换为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]我得到了错误。 有人可以帮我解释为什么会这样吗?

2 个答案:

答案 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