Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
题目解析:
将整个过程看作是求取链表的中值
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
ListNode *getMid(ListNode *head)
{
if(head == NULL)
return NULL;
if(head->next == NULL)
{
return head;
}
ListNode *midAft = NULL;
ListNode *mid = head;
ListNode *midPre = head->next->next;
while(midPre != NULL)
{
midAft = mid;
mid = mid->next;
midPre = midPre->next;
if(midPre == NULL)
break;
midPre = midPre->next;
}
if(midAft !=NULL)
midAft->next = NULL;
return mid;
}
TreeNode *sortedListToBST(ListNode *head) {
TreeNode *root;
if(head == NULL)
return NULL;
ListNode *mid = getMid(head);
root = (TreeNode *)malloc(sizeof(TreeNode));
root->val = mid->val;
ListNode *leftTree;
ListNode *rightTree;
if(mid == head)
leftTree = NULL;
else
leftTree = head;
rightTree = mid->next;
root->left = sortedListToBST(leftTree);
root->right = sortedListToBST(rightTree);
return root;
}
int main(void)
{
system("pause");
return 0;
}