原题链接:109. 有序链表转换二叉搜索树
solution:
递归:中间节点的左边是左子树,右边是右子树
class Solution {
public:
TreeNode* sortedListToBST(ListNode* head) {
if(head == nullptr) return nullptr; //节点为空直接返回
if(head->next == nullptr) return new TreeNode(head->val); //只有一个节点,建立树返回
//快慢指针,满指针slow走到中间节点
ListNode *slow = head,*fast = head;
ListNode *pre = new ListNode(-1);
pre->next = head;
while(fast != nullptr && fast->next != nullptr) {
pre = pre->next;
slow = slow->next;
fast = fast->next->next;
}
TreeNode *root = new TreeNode(slow->val); //建立根节点
pre->next = nullptr; //分割链表
//中间节点的左边是左子树,右边是右子树
root->left = sortedListToBST(head);
root->right = sortedListToBST(slow->next);
return root;
}
};