1、题目描述
输入一个有序链表,将其转换成平衡的BST。
2、思路
如果链表中节点数量为奇数,则刚好取所有节点的中点,用这个数字来生成树的根节点。
左右两边可以划分为两个长度相等的链表,分别生成树的左子树和右子树。
如果链表中节点数量为偶数,则取中线靠前的一个位置的节点,让它当根节点。
左边的链表长度比右边的少1,分别生成树的左子树和右子树。
时间复杂度O(nlogn)。
3、代码
TreeNode* sortedListToBST(ListNode* head) {
if(head==NULL)
return NULL;
else if(head->next==NULL){
TreeNode* root = new TreeNode(head->val);
return root;
}
ListNode* p = head;
ListNode* q = head->next;
ListNode* r = NULL;
while(q&&q->next){
r=p;
p=p->next;
q=q->next->next;
}
TreeNode* root = new TreeNode(p->val);
q=p->next;
if(r!=NULL)
r->next = NULL;
else
head=NULL;
//p=NULL;
root->left = sortedListToBST(head);
root->right = sortedListToBST(q);
return root;
}