Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST。
解题思路:对于一个给定个数的有序列表,其形成的平衡二叉树的形状只与它的个数有关,与具体的数值无关。首先可以先计算链表中节点的总个数,然后将中间节点构造成子树根节点,递归构造左右子树。
class Solution {
public:
TreeNode* sortedListToBST(ListNode* head) {
ListNode* p=head;
int count=0;
while(p!=NULL){
count++; //计算总节点个数
p=p->next;
}
if(count==0){
return NULL;
}else{
return helper(head,1,count); //对总节点数为count的链表进行递归构造平衡二叉树
}
}
TreeNode* helper(ListNode* head,int start,int end){
if(start>end){
return NULL;
}else if(start==end){
ListNode* p=head;
for(int i=1;i<start;i++){ //从第一个节点开始向后寻找,找到个数是start的节点
p=p->next;
}
return new TreeNode(p->val);
}
ListNode* p=head;
for(int i=1;i<(start+end)/2;i++){ //从第一个节点开始向后寻找,找到个数是(start+end)/2的节点,构造子树的根节点
p=p->next;
}
TreeNode* temphead=new TreeNode(p->val);
temphead->left=helper(head,start,(start+end)/2-1); //递归构造左子树
temphead->right=helper(head,(start+end)/2+1,end); //递归构造右子树
return temphead; //返回根节点
}
};