Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.
Example:
Given the sorted linked list: [-10,-3,0,5,9], One possible answer is: [0,-3,9,-10,null,5], which represents the following height balanced BST: 0 / \ -3 9 / /-10 5
对于bst来讲,左子树都比root小,右子树都比root大,所以对于排序好的链表,应该找到其中点作为root,并递归的对前半部分和右半部分进行操作。同时子函数应该返回,mid的前一个节点即prev
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* sortedListToBST(ListNode* head) { if (head == NULL) { return NULL; } vector<ListNode*> nodes = find_mid(head); ListNode* prev = nodes[0]; ListNode* mid = nodes[1]; TreeNode* root = new TreeNode(mid->val); if (mid->next != NULL) { root->right = sortedListToBST(mid->next); } if (prev != NULL) { prev->next = NULL; root->left = sortedListToBST(head); } return root; } private: vector<ListNode*> find_mid(ListNode* head) { vector<ListNode*> res; ListNode* prev = NULL; ListNode* slow = head; ListNode* fast = head; while (fast != NULL && fast->next != NULL) { prev = slow; slow = slow->next; fast = fast->next->next; } res.push_back(prev); res.push_back(slow); return res; } };