给出一个所有元素以升序排序的单链表,将它转换成一棵高度平衡的二分查找树
/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: The first node of linked list.
* @return: a tree node
*/
TreeNode *sortedListToBST(ListNode *head) {
// write your code here
if (head == NULL)
{
return NULL;
}
int len = 0;
ListNode *p = head;
while (p != NULL)
{
len++;
p = p->next;
}
return createTree(head, 0, len-1);
}
private:
TreeNode* createTree(ListNode *head, int left, int right)
{
if (left > right)
{
return NULL;
}
int mid = left + (right-left)/2;
ListNode *p = head;
for (int i = left; i < mid; i++)
{
p = p->next;
}
TreeNode *leftNode = createTree(head, left, mid-1);
TreeNode *rightNode = createTree(p->next, mid+1, right);
TreeNode *root = new TreeNode(p->val);
root->left = leftNode;
root->right = rightNode;
return root;
}
};