Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode *sortedListToBST(ListNode *head) {
TreeNode *root=NULL;
dfs(root,head);
return root;
}
void dfs(TreeNode *&root,ListNode *&head)
{
if(head==NULL)
return;
ListNode *f=NULL;//f是中间节点的前驱节点
ListNode *midNode=BinarySearch(head,f);
root=new TreeNode(midNode->val);
//遍历左半部分
if(midNode!=head)//相等的时候,表示该链表只有一个节点的情况,此时f=NULL,f1=f2=head,此时左半部分不存在了,所以不再遍历左半部分;其实这句话修改成if(f!=NULL)也对,反而更容易理解
{
f->next=NULL;
dfs(root->left,head);
}
dfs(root->right,midNode->next);
}
ListNode *BinarySearch(ListNode *head,ListNode *&f)
{//若head只有一个节点,那么最后该函数返回时,f=NULL,f1=head,f2=head;
if(head==NULL)
return NULL;
ListNode *f1=head,*f2=head;
while(f2 && f2->next)
{
f=f1;
f2=f2->next->next;
f1=f1->next;
}
return f1;
}
};