图解LeetCode——108. 将有序数组转换为二叉搜索树

简介: 图解LeetCode——108. 将有序数组转换为二叉搜索树

一、题目

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

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

二、示例

2.1> 示例 1:

输入】nums = [-10,-3,0,5,9]

输出】[0,-3,9,-10,null,5]

解释】[0,-10,5,null,-3,null,9] 也将被视为正确答案:

2.2> 示例 2:

输入】nums = [1,3]

输出】[3,1]

解释】[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。

提示:

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

三、解题思路

根据题目要求,我们要根据题目给出的nums数组,将其转换为一棵 高度平衡 二叉搜索树。那么我们就要保障根节点的左子树节点总数右子树节点总数之差不要超过1。

首先,我们要获得中心节点mid,有如下两种获取方式:

方式1】通过数组长度除以2获得中心点mid—— nums.length / 2

方式2】通过双指针除以2获得中心点mid—— (start + end) / 2;

然后,我们创建min值对应的TreeNode,即:new TreeNode(nums[mid]); 由于我希望减少数组切割的性能消耗,所以采用双指针的方式进行“数组拆分”操作。那么寻找中心点mid也就自然而然的采用“方式2”了。此时,将原有数组拆分为两部分,分别为[start, mid-1][mid+1, end],然后再分别针对这两部分数组再次执行上面操作即可。

通过以上的解题思路,我们在编码时,就可以通过递归调用方式进行解题了。为了便于大家理解,下面我们以输入nums = [-10,-3,0,5,9]为例,看一下具体的解题过程。请见下图所示:

四、代码实现

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return sort(nums, 0, nums.length - 1);
    }
    public TreeNode sort(int[] nums, int start, int end) {
        if (start > end) return null;
        int mid = (start + end) / 2;  // nums数组的寻找中心点
        TreeNode node = new TreeNode(nums[mid]); 
        node.left = sort(nums, start, mid - 1); // 获得node的左节点
        node.right = sort(nums, mid + 1, end); // 获得node的右节点
        return node;
    }
}
/**
 * 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;
 *     }
 * }
 */

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

相关文章
|
27天前
|
存储 Java API
LeetCode------合并两个有序数组(4)【数组】
这篇文章介绍了LeetCode上的"合并两个有序数组"问题,并提供了三种解法:第一种是使用Java的Arrays.sort()方法直接对合并后的数组进行排序;第二种是使用辅助数组和双指针技术进行合并;第三种则是从后向前的双指针方法,避免了使用额外的辅助数组。
LeetCode------合并两个有序数组(4)【数组】
|
26天前
|
算法
LeetCode第26题删除有序数组中的重复项
这篇文章介绍了LeetCode第26题"删除有序数组中的重复项"的解题方法,通过使用双指针技巧,高效地去除数组中的相邻重复元素。
LeetCode第26题删除有序数组中的重复项
|
26天前
|
算法
LeetCode第80题删除有序数组中的重复项 II
文章介绍了LeetCode第80题"删除有序数组中的重复项 II"的解法,利用双指针技术在O(1)空间复杂度内原地删除重复元素,并总结了双指针技术在处理有序数组问题中的应用。
LeetCode第80题删除有序数组中的重复项 II
|
1月前
|
Python
【Leetcode刷题Python】450. 删除二叉搜索树中的节点
LeetCode上538号问题"把二叉搜索树转换为累加树"的Python实现,使用反向中序遍历并记录节点值之和来更新每个节点的新值。
22 4
【Leetcode刷题Python】450. 删除二叉搜索树中的节点
|
1月前
|
Python
【Leetcode刷题Python】96. 不同的二叉搜索树
LeetCode 96题 "不同的二叉搜索树" 的Python解决方案,使用动态规划算法计算由1至n互不相同节点值组成的二叉搜索树的种数。
14 3
【Leetcode刷题Python】96. 不同的二叉搜索树
|
1月前
|
Python
【Leetcode刷题Python】977. 有序数组的平方
解决LeetCode "有序数组的平方" 问题的方法:使用Python内置的快速排序、直接插入排序(但会超时)和双指针技术,并给出了每种方法的Python实现代码。
11 1
【Leetcode刷题Python】977. 有序数组的平方
|
26天前
|
算法
LeetCode第88题合并两个有序数组
文章分享了LeetCode第88题"合并两个有序数组"的解法,通过从后向前的合并策略避免了数组元素的前移,使用三个指针高效地完成了合并过程。
|
26天前
|
算法
LeetCode第96题不同的二叉搜索树
文章介绍了LeetCode第96题"不同的二叉搜索树"的解法,利用动态规划的思想和递推公式,通过计算以任意节点为根的不同二叉搜索树的数量,解决了该问题。
LeetCode第96题不同的二叉搜索树
|
1月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
14 3
|
1月前
|
Python
【Leetcode刷题Python】538. 把二叉搜索树转换为累加树
LeetCode上538号问题"把二叉搜索树转换为累加树"的Python实现,使用反向中序遍历并记录节点值之和来更新每个节点的新值。
17 3
http://www.vxiaotou.com