[LeetCode] Convert Sorted List to Binary Search Tree 將有序連結串列轉為二叉搜尋樹
阿新 • • 發佈:2018-12-27
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
這道題是要求把有序連結串列轉為二叉搜尋樹,和之前那道Convert Sorted Array to Binary Search Tree 將有序陣列轉為二叉搜尋樹思路完全一樣,只不過是操作的資料型別有所差別,一個是陣列,一個是連結串列。陣列方便就方便在可以通過index直接訪問任意一個元素,而連結串列不行。由於二分查詢法每次需要找到中點,而連結串列的查詢中間點可以通過快慢指標來操作,可參見之前的兩篇部落格 Reorder List 連結串列重排序和Linked List Cycle II 單鏈表中的環之二有關快慢指標的應用。找到中點後,要以中點的值建立一個數的根節點,然後需要把原連結串列斷開,分為前後兩個連結串列,都不能包含原中節點,然後再分別對這兩個連結串列遞迴呼叫原函式,分別連上左右子節點即可。程式碼如下:
/** * 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) return NULL;if (!head->next) return new TreeNode(head->val); ListNode *slow = head; ListNode *fast = head; ListNode *last = slow; while (fast->next && fast->next->next) { last = slow; slow = slow->next; fast = fast->next->next; } fast = slow->next; last->next = NULL; TreeNode *cur = new TreeNode(slow->val); if (head != slow) cur->left = sortedListToBST(head); cur->right = sortedListToBST(fast); return cur; } };