给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定的有序链表: [-10, -3, 0, 5, 9],
一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
/**
* 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 ListNode *helper(struct ListNode* head,int pos)
{
while(pos>0)
{
head=head->next;
pos--;
}
return head;
}
struct TreeNode *DFS(struct ListNode* head,int size)
{
if(size<=0)return NULL;
int pos=size/2;
struct TreeNode *ret=(struct TreeNode *)malloc(sizeof(struct TreeNode ));
struct ListNode* now=helper(head,pos);
ret->val=now->val;
ret->left=DFS(head,pos);
ret->right=DFS(now->next,size-1-pos);
return ret;
}
struct TreeNode* sortedListToBST(struct ListNode* head){
int size=0;
struct ListNode*tmp=head;
while(tmp)
{
size++;
tmp=tmp->next;
}
return DFS(head,size);
}
执行用时 :24 ms, 在所有C提交中击败了100.00% 的用户
内存消耗 :22 MB, 在所有C提交中击败了100.00%的用户