leecode刷题 将有序数组转换为二叉搜索树

简介: 给定一个升序排列的整数数组 `nums`,要求将其转换为一棵高度平衡的二叉搜索树(BST)。通过递归方法,选择数组中间元素作为根节点,左半部分构建左子树,右半部分构建右子树。优化后的代码使用索引递归,避免了数组复制操作,提高了效率。

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

示例 1:
image.png

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

示例 2:
image.png

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

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

我第一个方案是采用的数组截取的方式


/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
import java.util.Arrays;

class Solution {
   
    public TreeNode sortedArrayToBST(int[] nums) {
   
        if (nums == null)
            return null;
        int mid = (nums.length) / 2;
        TreeNode root = new TreeNode(nums[mid]);
        // left 0,mid-1,right mid+1,nums.lenght-1
        if (mid == 1) {
   
            root.left = new TreeNode(nums[0]);
        } else if (mid >= 2) {
   
            int[] leftnums = Arrays.copyOfRange(nums, 0, mid);

            root.left = sortedArrayToBST(leftnums);
        }
        if (mid == nums.length - 2) {
   
            root.right = new TreeNode(nums[nums.length - 1]);
        } else if (mid < nums.length - 2) {
   
            int[] rightnum = Arrays.copyOfRange(nums, mid + 1, nums.length);

            root.right = sortedArrayToBST(rightnum);
        }

        return root;

    }

}

这个方案AI优化后,认为可以通过索引的方式完成递归,以下为优化后的代码


public class Solution {
   
    public TreeNode sortedArrayToBST(int[] nums) {
   
        if (nums == null || nums.length == 0) {
   
            return null;
        }
        return buildBST(nums, 0, nums.length - 1);
    }

    private TreeNode buildBST(int[] nums, int start, int end) {
   
        if (start > end) {
   
            return null;
        }
        int mid = start + (end - start) / 2;
        TreeNode root = new TreeNode(nums[mid]);
        root.left = buildBST(nums, start, mid - 1);
        root.right = buildBST(nums, mid + 1, end);
        return root;
    }
}
相关文章
代码随想录Day19 LeetCode T669修剪二叉搜索树 LeetCode T108将有序数组转化为二叉搜索树 T538 把二叉搜索树转化为累加树
代码随想录Day19 LeetCode T669修剪二叉搜索树 LeetCode T108将有序数组转化为二叉搜索树 T538 把二叉搜索树转化为累加树
46 0
代码随想录Day17 LeetCode T98 验证二叉搜索树 T530 二叉搜索树的最小绝对差 T501 二叉搜索树中的众数 T236二叉搜索树的最近公共祖先
代码随想录Day17 LeetCode T98 验证二叉搜索树 T530 二叉搜索树的最小绝对差 T501 二叉搜索树中的众数 T236二叉搜索树的最近公共祖先
68 0
|
7月前
|
算法
基础算法-去重字符串,辗转相除法,非递归前序遍历二叉树题型分析
基础算法-去重字符串,辗转相除法,非递归前序遍历二叉树题型分析
|
8月前
|
算法 C++
【刷题】Leetcode 1609.奇偶树
这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!
44 0
每日一题:LeetCode-103/107.二叉树的(层序/锯齿形层序)遍历
每日一题:LeetCode-103/107.二叉树的(层序/锯齿形层序)遍历
|
算法
代码随想录算法训练营第二十二天 | LeetCode 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树
代码随想录算法训练营第二十二天 | LeetCode 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树
60 0
|
算法 测试技术 API
【二分查找】二分查找算法练习题
【二分查找】二分查找算法练习题
|
算法 Java
代码随想录训练营day23| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树...
代码随想录训练营day23| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树...
|
人工智能 算法
【数据结构与算法】数组2:双指针法 & 二分法(螺旋矩阵)
【数据结构与算法】数组2:双指针法 & 二分法(螺旋矩阵)
108 0
|
机器学习/深度学习
leetcode-每日一题558. 四叉树交集(分治递归)
时间复杂度:O(n2),其中 n 是四叉树 quadTree1 和 quadTree2 对应矩阵的边长。最坏的情况下,整个矩阵都会被遍历
113 0
leetcode-每日一题558. 四叉树交集(分治递归)