问题描述:
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.
Example:
Given the sorted linked list: [-10,-3,0,5,9],
One possible answer is: [0,-3,9,-10,null,5], which represents the following height balanced BST:
0
/ \
-3 9
/ /
-10 5
解题思路:
二叉搜索树的中序遍历为排序输出,链表中间节点即为二叉树的根节点,首先找到链表的中间节点,然后左右分别递归。此算法的复杂为O(nlogn),如果有复杂度更低的算法可留言交流
代码实现:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode* sortedListToBST(struct ListNode* head) {
struct TreeNode* curTreeNode = NULL;
struct ListNode* fast = head;
struct ListNode* slow = head;
struct ListNode* pre = head;
if (head == NULL)
{
return head;
}
while(fast != NULL && fast->next != NULL)
{
pre = slow;
slow = slow->next;
fast = fast->next->next;
}
if(pre != NULL)
pre->next = NULL;
curTreeNode = malloc(sizeof(struct TreeNode));
curTreeNode->val = slow->val;
if(head == slow)
{
curTreeNode->left = curTreeNode->right = NULL;
return curTreeNode;
}
curTreeNode->left = sortedListToBST(head);
curTreeNode->right = sortedListToBST(slow->next);
return curTreeNode;
}