(一)问题描述
平衡二叉树 是指该树所有节点的左右子树的高度相差不超过 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
按 严格递增 顺序排列
(二)解决思路
用一个有序数组转化成二叉搜索树,无论是不是限定"平衡",可能的结果都会有好几种。以下图片来自力扣官方题解。
这里我将数组分为左右两半,中间节点作为根节点,左边一半再分为一半,取中间节点,右边一半也再分为一半,取中间节点,以此类推。
这里有两点小细节:
- 当考虑范围内的长度为偶数时,中间节点取左侧节点
- 递归的结束条件是考虑范围的左边界left<右边界right,而不是等于。可以想象只有一个节点的情况,如果是等于,会遗漏节点。
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 sort(0,nums.length-1,nums);
}
public TreeNode sort(int left,int right,int[] nums){
//这里不能是等于,只能是大于
if(left>right) return null;
int idx=(left+right)/2;
TreeNode mid=new TreeNode(nums[idx]);
mid.left=sort(left,idx-1,nums);
mid.right=sort(idx+1,right,nums);
return mid;
}
}