本人电子系,只为一学生。心喜计算机,小编以怡情。
给出一个所有元素以升序排序的单链表,将它转换成一棵高度平衡的二分查找树
思路:很容易想到了要每次取中,也很容易的想到了要用递归来做。
注意:使用ArrayList的subList要用List来定义。
如:List temp=new ArrayList();
public TreeNode sortedListToBST(ListNode head) {
// write your code here
if(head==null) return null;
//链表转换成List,为了以后的subList与get容易一些
//当然也可以不这样做,只是定位会比较麻烦
List<Integer> temp=new ArrayList<Integer>();
while(head!=null)
{
temp.add(head.val);
head=head.next;
}
//调用retree方法,构造二分查找树
TreeNode ret=retree(temp);
return ret;
}
public TreeNode retree(List<Integer> temp)
{
//当子链表长度不同时,mid的定位也不同
int mid=0;
if(temp.size()%2==0)
mid=temp.size()/2-1;
else {
mid=temp.size()/2;
}
//注意mid的范围,要进行检查否则会报错
if(mid<0||mid>=temp.size()) return null;
//构造新树的结点
TreeNode head=new TreeNode(temp.get(mid));
//建立连接
head.left=retree( temp.subList(0, mid));
head.right=retree( temp.subList(mid+1, temp.size()));
return head;
}