给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树
https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/
示例1:
输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案0 0 / \ / \ -3 9 或 -10 5 / / \ \ -10 5 -3 9
示例2:
输入:nums = [1,3]
输出:[3,1]
解释:[1,3] 和 [3,1] 都是高度平衡二叉搜索树。
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 按 严格递增 顺序排列
Java解法
思路:
- 高度平衡意味着左右子树长度差不多,对于原始数组来说==[(左子树)root (右子树)]
- 数组严格递增,实际就相当于不断得切分数组,在创建节点时保证左<根<右
package sj.shimmer.algorithm.m3_2021;
import sj.shimmer.algorithm.TreeNode;
/**
* Created by SJ on 2021/3/22.
*/
class D56 {
public static void main(String[] args) {
TreeNode treeNode = sortedArrayToBST(new int[]{-10, -3, 0, 5, 9});
TreeNode.getIntegerArray(treeNode);
}
public static TreeNode sortedArrayToBST(int[] nums) {
return sortedArrayToBST(nums,0,nums.length-1);
}
public static TreeNode sortedArrayToBST(int[] nums,int start,int end) {
TreeNode root = null;
if (start<=end) {
int mid = (start + end) / 2;
root = new TreeNode(nums[mid]);
root.left= sortedArrayToBST(nums,start,mid-1);
root.right= sortedArrayToBST(nums,mid+1,end);
}
return root;
}
}
image
官方解
-
中序遍历,总是选择中间位置左边的数字作为根节点
选择中间位置左边的数字作为根节点 ,与我的解法一致
- 时间复杂度: O(n)
- 空间复杂度:O(logn)
-
中序遍历,总是选择中间位置右边的数字作为根节点
-
中序遍历,选择任意一个中间位置数字作为根节点
网友评论