大家好!我是曾续缘❤️
今天是《LeetCode 热题 100》系列
发车第 42 天
二叉树第 7 题
❤️点赞 👍 收藏 ⭐再看,养成习惯
给你一个整数数组
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 <= 104
-104 <= nums[i] <= 104
nums
按 严格递增 顺序排列
解题方法
这道题目的要求是将一个有序数组转换为一棵高度平衡的二叉搜索树。为什么要强调平衡呢?因为如果不要求平衡,就可以简单地以线性结构的方式构造出二叉搜索树。
为了实现平衡,我们可以将数组的一半元素分配给左子树,另一半元素分配给右子树,并将中间的值作为根节点。通过递归的方式处理左右区间,最终就可以得到一棵满足要求的二叉搜索树。
步骤如下:
- 基准情况判断:当左指针大于右指针时,返回null,表示当前子树为空。
- 计算中间位置:取当前区间的中间位置作为根节点,保证左右子树元素数量相对平衡。
- 构建根节点:以中间位置处的元素值创建根节点。
- 递归构建左右子树:分别递归处理左半部分和右半部分,作为当前根节点的左右子树。
Code
查看代码
java
/**
* 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;
* }
* }
*/
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return inorder(nums, 0, nums.length - 1);
}
private TreeNode inorder(int[] nums, int l, int r){
if(l > r){
return null;
}
int mid = (l + r) >> 1;
TreeNode root = new TreeNode(nums[mid]);
root.left = inorder(nums, l, mid - 1);
root.right = inorder(nums, mid + 1, r);
return root;
}
}