中序遍历思想,找到中位数构建根节点,然后左右链表递归构建左子树和右子树
class Solution {
public:
TreeNode *sortedListToBST(ListNode *head) {
//递归方法实现,通过中位数构建树的根节点,左右子链表构建左子树和右子树
TreeNode *root=NULL;
if(!head)
return root;
if(!head->next)
{
root=(TreeNode *)malloc(sizeof(TreeNode));
root->val=head->val;
root->left=NULL;
root->right=NULL;
return root;
}
ListNode *p,*q,*pre;//pre指向中位数结点的前一个结点
p=head;
q=head;
pre=head;
while(q&&q->next)
{
if(p!=head)
pre=pre->next;
p=p->next;
q=q->next->next;
}
ListNode *mid;//mid为中位数结点
mid=p;
pre->next=NULL;
q=mid->next;
root=(TreeNode *)malloc(sizeof(TreeNode));
root->val=mid->val;
root->left=sortedListToBST(head);
root->right=sortedListToBST(q);
return root;
}
};