题目:
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
题意:
就是给定一个已经排好序的单链表,然后将这个单链表生成一棵平衡的二叉搜索树。
题解:
首先,根据可以利用之前做过的给定一个排好序的数组,然后来构造平衡的二叉搜索树,可以用一个ArrayList来存,因为ArrayList具有数组的特性,所以我的思路和之前的一样。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution
{
public TreeNode sortedListToBST(ListNode head)
{
ArrayList list = new ArrayList();
while(head != null) //先将所有的节点都保存在ArrayList中
{
list.add(head.val);
head = head.next;
}
int length = list.size();
return middlesearch(list,0,length - 1,length);
}
public TreeNode middlesearch(ArrayList list,int start,int end,int length)
{
int i = 0,j = 0,value = 0;
if(length == 0)
return null;
if(length % 2 != 0)
{
value = (int) list.get(start + length / 2);
i = start + length / 2 - 1;
j = start + length / 2 + 1;
}
else if(length % 2 == 0)
{
if(length / 2 != 0)
{
value = (int) list.get(start + length / 2 - 1);
i = start + length / 2 - 2;
j = start + length / 2;
}
else if(length / 2 == 0)
{
value = (int) list.get(start + length / 2 + 1);
i = start + 1;
j = start + 1;
}
}
TreeNode root = new TreeNode(value);
root.left = middlesearch(list,start,i ,i - start + 1); //然后用递归
root.right = middlesearch(list,j,end,end - j + 1);
return root;
}
}