1. 程式人生 > >[LeetCode] Convert Sorted List to Binary Search Tree 將有序連結串列轉為二叉搜尋樹

[LeetCode] 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.

這道題是要求把有序連結串列轉為二叉搜尋樹,和之前那道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; } };