Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
因为已经是排好序的list,故不需要用到红黑树等复杂的构建平衡二叉查找树的方法,具体思路即为,每次查找到中间的节点,将其作为树的根节点,以该点切分,其左侧以及右侧皆采用此方法,最终即构建出来所需的树。边界条件需要多加注意,目前的感觉是自己写好一个test case,然后一些边界条件就拿那个简单的test case边写边验证一下。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; next = null; }
* }
*/
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode sortedListToBST(ListNode head) {
int length = 0;
ListNode node = head;
while(node!=null){
node = node.next;
length++;
}
return sortedListToBST(head, length);
}
private TreeNode sortedListToBST(ListNode head, int length){
if(length == 0 || head == null){
return null;
}else if(length == 1){
return new TreeNode(head.val);
}
ListNode peak = head;
int index = (int)(length/2);
for(int i = 0; i<index; i++){
peak = peak.next;
}
TreeNode node = new TreeNode(peak.val);
node.left = sortedListToBST(head, index);
node.right = sortedListToBST(peak.next, length - index - 1);
return node;
}
}