给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
先贴一个二叉搜索树的概念
要实现一棵 高度平衡 二叉搜索树,实际上就是要保证每个节点 是 以此节点为根的子树 的 所有节点 中位数。
那就需要我们不断地缩小区间找中位数,也就是二分法
这里使用递归实现的二分法,原因是 非递归 需要多个栈来保存值
/** * 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 helper(nums, 0, nums.length - 1); } public TreeNode helper(int[] nums, int left, int right) { if (left > right) { return null; } int mid = (left + right) / 2; TreeNode root = new TreeNode(nums[mid]); root.left = helper(nums, left, mid - 1); root.right = helper(nums, mid + 1, right); return root; } }
不使用辅助函数
class Solution { public TreeNode sortedArrayToBST(int[] nums) { if(nums.length==0) return null; int mid = (nums.length-1)/2; TreeNode root=new TreeNode(nums[mid]); root.left=sortedArrayToBST(Arrays.copyOfRange(nums,0,mid)); root.right=sortedArrayToBST(Arrays.copyOfRange(nums,mid+1,nums.length)); return root; } }
知识点:
Arrays.copyOfRange(T[ ] original,int from,int to)
- original:第一个参数为要拷贝的数组对象
- from:第二个参数为拷贝的开始位置(包含)
- to:第三个参数为拷贝的结束位置(不包含)
总结:无