1 问题
给你一个整数数组 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,null,3] 和 [3,1] 都是高度平衡二叉搜索树
。
提示
- 1 <= nums.length <= 104
- -104 <= nums[i] <= 104
- nums 按严格递增顺序排列
2 解题思路
二叉树结构:
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;
}
}
题目中醒目给出数组是严格递增的
,也就是数组不存在相同的元素且升序排列。立马应该想到二分法
递归解决此类问题。
而高度平衡二叉搜索树
要求结果不能随意是一个二叉树,因此再构造的时候,
- 当前节点的左子树所有节点的元素值一定是严格小于当前节点的值;
- 其右子树所有节点的元素值一定是严格大于当前节点的值。
我们可以结合题目给定的严格递增
条件,轻松解决:
- 定义构造BST的方法为:
TreeNode createBST(int[] nums, int start, int end);
,其中nums
是题目已知的数组,start表示子树的起始位置,end则表示子树的结束位置; - 选择数组中间节点为根节点:
TreeNode root = new TreeNode(nums[mid]);
root.left=createBST(nums, start, mid - 1);
,递归解决当前节点左子树构造问题,限定了左子树的范围是在数组索引[start, mid-1]
的范围;- 同理,
root.right = createBST(nums, mid + 1, end);
,解决其右子树构造问题,其右子树在数组的范围是[mid+1, end]
。
3 代码
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
//二分法(提示了 严格递增数组)
return createBST(nums, 0, nums.length - 1);
}
private TreeNode createBST(int[] nums, int start, int end) {
if (start > end) {
return null;
}
int mid = start + (end - start) / 2;
//build a root
TreeNode root = new TreeNode(nums[mid]);
root.left = createBST(nums, start, mid - 1);
root.right = createBST(nums, mid + 1, end);
return root;
}
}