leetcode 108. 将有序数组转换为二叉搜索树

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

 

示例 1:


输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

示例 2:


输入:nums = [1,3]
输出:[3,1]
解释:[1,3] 和 [3,1] 都是高度平衡二叉搜索树。
 

提示:

1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 按 严格递增 顺序排列

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

先求出中点,就是根节点,之后递归,左节点都在中点的左边,右节点都在中点的右边,直到超出数组返回停止。

    public TreeNode sortedArrayToBST(int[] nums) {
        if (nums == null || nums.length == 0) {
            return null;
        }
        int length = nums.length;
        int st = 0;
        int end = length - 1;
        int m = st + ((end - st) >> 1);
        TreeNode root = new TreeNode(nums[m]);
        adjust(nums, root, st, end, m);
        return root;
    }

    /**
     * 调整
     *
     * @param nums 数组
     * @param node 节点
     * @param st   数组开始索引
     * @param end  数组结束索引
     * @param m    中点
     */
    private static void adjust(int[] nums, TreeNode node, int st, int end, int m) {
        if (st > end) {
            return;
        }
        int l = st + ((m - 1 - st) >> 1);
        int r = m + 1 + ((end - 1 - m) >> 1);
        if (l >= st) {
            node.left = new TreeNode(nums[l]);
            adjust(nums, node.left, st, m - 1, l);
        }
        if (r >= m + 1 && r <= end) {
            node.right = new TreeNode(nums[r]);
            adjust(nums, node.right, m + 1, end, r);
        }
    }

时间上还可以,空间上较为拉跨。。

 

posted @ 2021-04-16 10:51  旺仔古李  阅读(48)  评论(0编辑  收藏  举报