108. 将有序数组转换为二叉搜索树
题目:
思路:
【1】因为 题目要求 高度平衡,所以两边的层数大致要一致,那么如何一致呢,就是划分的左右子树的节点数大概也是差不多的,这样一想用二分就可以了,中间结点为根结点,然后分出来的两边又会再次形成原本的小问题(递归的做法)
代码展示:
//时间0 ms 击败 100% //内存42.1 MB 击败 54.36% //时间复杂度:O(n),其中 n 是数组的长度。每个数字只访问一次。 //空间复杂度:O(logn),其中 n 是数组的长度。 //空间复杂度不考虑返回值,因此空间复杂度主要取决于递归栈的深度,递归栈的深度是 O(logn)。 /** * 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) { if (nums.length == 0) return null; if (nums.length == 1) return new TreeNode(nums[0]); return arrayToBST(nums,0,nums.length-1); } private TreeNode arrayToBST(int[] nums, int left, int right){ if (left == right) return new TreeNode(nums[left]); int mid = left + (right-left)/2; TreeNode root = new TreeNode(nums[mid]); if (mid != left){ root.left = arrayToBST(nums,left,mid-1); } if (mid != right){ root.right = arrayToBST(nums,mid+1,right); } return root; } }