LeetCode--108.将有序数组转换为二叉搜索树(二叉树)

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

题目描述

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

示例 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,null,3] 和 [3,1] 都是高度平衡二叉搜索树。

提示:

  • 1 <= nums.length <= 10^4
  • -10^4 <= nums[i] <= 10^4
  • nums严格递增 顺序排列

图解思路

代码

java 复制代码
/**
 * 将有序数组转换为高度平衡二叉搜索树
 */
class Solution {

    /**
     * 在 nums[left, right] 区间内构造平衡 BST
     *
     * 使用左闭右闭区间:
     * [left, right]
     */
    public TreeNode buildBBST(int[] nums, int left, int right) {

        // 区间为空,无法构造节点
        if (left > right) return null;

        // 取区间中点作为根节点
        //
        // 因为数组本身有序:
        // 中点左边都比它小
        // 中点右边都比它大
        //
        // 因此天然满足 BST 性质
        //
        // 同时中点划分能保证左右子树节点数量尽量接近,
        // 从而保证树高度平衡
        int mid = left + (right - left) / 2;

        TreeNode root = new TreeNode(nums[mid]);

        // 构建左子树
        //
        // 左区间所有元素 < nums[mid]
        root.left = buildBBST(nums, left, mid - 1);

        // 构建右子树
        //
        // 右区间所有元素 > nums[mid]
        root.right = buildBBST(nums, mid + 1, right);

        return root;
    }

    public TreeNode sortedArrayToBST(int[] nums) {

        // 从整个数组开始构建 BST
        return buildBBST(nums, 0, nums.length - 1);
    }
}
相关推荐
MartinYeung521 小时前
[论文学习]DP2Unlearning:高效且具保证的大型语言模型遗忘框架(基于差分隐私的 LLM Unlearning 方法)
学习·算法·语言模型
Tian_Hang21 小时前
C++原型模式(Protype)
开发语言·c++·算法
bIo7lyA8v21 小时前
算法复杂度的渐进分析与实际运行时间的差异的技术8
算法
yuan199971 天前
欧拉梁静力与屈曲计算的 MATLAB 实现(有限差分法 + 解析解)
开发语言·算法·matlab
汉克老师1 天前
GESP7级C++考试语法知识(二、指数函数(3、综合练习)
c++·算法·数学建模·指数函数·gesp7级·复利
林间码客1 天前
04 ROC曲线与AUC:从零开始手动计算
大数据·人工智能·算法
Irissgwe1 天前
map/set/multimap/multiset 的底层逻辑与实现
数据结构·c++·算法·二叉树·stl·c·红黑树
圣保罗的大教堂1 天前
leetcode 2130. 链表最大孪生和 中等
leetcode
IronMurphy1 天前
【算法五十八】23. 合并 K 个升序链表
数据结构·算法·链表
思茂信息1 天前
CST软件基于液态金属开关的方向图可重构天线
服务器·算法·重构·cst·仿真软件·电磁仿真