一. 问题描述
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
0
/
-3 9
/ /
-10 5
二. 解题思路
本题思路:采用二叉搜索树的特性+递归来进行求解,二叉树的根节点必定是有序数组的中间那个树,而数组左边则是左子树,右边是右子树,可采用递归进行求解。
步骤一:构建递归函数(左子树列表leftlist,右子树列表rightlist,根节点)。
步骤二:分别从左子树列表、和右子树列表中找到中间数代表根节点的左右子树。然后依次使用递归函数接着将左右子树作为根节点进行递归。
步骤三:当左子树和右子树列表都空的时候则返回。
三. 执行结果
执行用时 :7 ms, 在所有 java 提交中击败了6.13%的用户
内存消耗 :38.9 MB, 在所有 java 提交中击败了42.53%的用户
四. Java代码
class Solution { public TreeNode sortedArrayToBST(int[] nums) { if(nums.length<=0) { TreeNode root=null ; return root; }else { int num=nums.length/2; List<Integer> leftlist=new ArrayList<Integer>(); List<Integer> rightlist=new ArrayList<Integer>(); for(int i=0;i<nums.length;i++) { if(i<num) leftlist.add(nums[i]); if(i>num) rightlist.add(nums[i]); } TreeNode root=new TreeNode(nums[num]); getTree(leftlist,rightlist,root); return root; } } public void getTree(List<Integer> leftlist,List<Integer> rightlist,TreeNode root) { if(leftlist.size()==0&&rightlist.size()==0) { return; } if(leftlist.size()>0) { int leftnum=leftlist.size()/2; List<Integer> newleftlist=new ArrayList<Integer>(leftlist.subList(0, leftnum)); List<Integer> newleftlistright=new ArrayList<Integer>(leftlist.subList(leftnum+1, leftlist.size())); root.left=new TreeNode(leftlist.get(leftnum)); getTree(newleftlist,newleftlistright,root.left); } if(rightlist.size()>0) { int rightnum=rightlist.size()/2; List<Integer> newrightlistleft=new ArrayList<Integer>(rightlist.subList(0, rightnum)); List<Integer> newrightlistright=new ArrayList<Integer>(rightlist.subList(rightnum+1, rightlist.size())); root.right=new TreeNode(rightlist.get(rightnum)); getTree(newrightlistleft,newrightlistright,root.right); } } }