Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
题目描述很简单,就是说把一个升序链表转换成平衡二叉排序树,即 最优二叉排序树, 最优二叉排序树的搜索时间为logn 即树的高度, 因为链表很难处理,直接转换成数组比较容易, 从中间建立树根,递归建立左右子树即可。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution
{
public:
TreeNode *sortedListToBST(ListNode *head)
{
if (head == NULL) return NULL;
ListNode *ptr = head;
int *array = NULL, len = 0, i = 0;
while (ptr)
{
len++;
ptr = ptr->next;
}
ptr = head;
array = new int[len];
while (i < len)
{
array[i++] = ptr->val;
ptr = ptr->next;
}
return arrayToBST(array, 0, len - 1);
}
private:
TreeNode *arrayToBST(int array[], int start, int end)
{
if (start > end) return NULL;
int mid = (start + end) / 2;
TreeNode *root = new TreeNode(array[mid]);
root->left = arrayToBST(array, start, mid - 1);
root->right = arrayToBST(array, mid + 1, end);
return root;
}
};