Convert Sorted List to Binary Search Tree
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
为了满足平衡要求,容易想到提出中间节点作为树根,因为已排序,所以左右两侧天然满足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) { if(head == NULL) return NULL; else if(head->next == NULL) return new TreeNode(head->val); ListNode* mid = findMid(head); TreeNode* root = new TreeNode(mid->val); root->left = sortedListToBST(head); root->right = sortedListToBST(mid->next); return root; } ListNode* findMid(ListNode* head) { ListNode* preslow = NULL; ListNode* slow = head; ListNode* fast = head; while(fast != NULL) { fast = fast->next; if(fast != NULL) { fast = fast->next; preslow = slow; slow = slow->next; } } //break the list into two parts preslow->next = NULL; return slow; } };