题目:
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
思路:以数组最中间的元素作为二叉搜索树的根节点,前一半数组作为左子树,后一半数组作为右子树,递归调用即可构建出高低平衡的二叉树。
我自己重新做了一遍这个题,刚开始没有思路,后来慢慢写着就有了。。。。不过这是一个简单题,我做的时候还是有挺多问题的。
首先题目中的条件是升序的数组,要求的是高度平衡的二叉搜索树。平衡指的是左右子树之间的高度差不超过1,二叉搜索树是指左子树小于根节点右子树大于根节点。我想到是直接使用数组中间元素作为根节点,然后进行递归调用处理左右子树。要注意的是这个黑体的条件要写全。
代码如以下代码1:
代码1:
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
if(nums==null||nums.length==0)
return null;
if(nums.length==1)
return new TreeNode(nums[0]);
int n=nums.length;
TreeNode root=build(nums,0,n-1);
return root;
}
private TreeNode build(int[]nums,int low,int high){
if(low==high)
return new TreeNode(nums[low]);
int mid=low+(high-low)/2;
if(high-low==1)
{
TreeNode root=new TreeNode(nums[mid]);
root.left=null;
root.right=new TreeNode(nums[high]);
return root;
}
TreeNode root=new TreeNode(nums[mid]);
root.left=build(nums,low,mid-1);
root.right=build(nums,mid+1,high);
return root;
}
}
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
int end=nums.length;
if(end<=0)
return null;
return buildT(nums,0,end-1);
}
public static TreeNode buildT(int[] nums,int lo,int hi)
{ if(lo<=hi)
{
int mid=(hi+lo)/2;
TreeNode root=new TreeNode(nums[mid]);
root.left=buildT(nums,lo,mid-1);
root.right=buildT(nums,mid+1,hi);
return root;
}
else{
return null;
}
}
}