109,有序連結串列轉換為二叉搜尋樹
給定一個單鏈表,其中的元素按升序排序,將其轉換為高度平衡的二叉搜尋樹。
本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
示例:
給定的有序連結串列: [-10, -3, 0, 5, 9], 一個可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面這個高度平衡二叉搜尋樹: 0 / \ -3 9 / / -10 5
思路:和有序陣列轉換為二叉搜尋樹差不多,只不過是操作的資料型別有所差別,一個是陣列,一個是連結串列。陣列方便就方便在可以通過index直接訪問任意一個元素,而連結串列不行。由於二分查詢法每次需要找到中點,而連結串列的查詢中間點可以通過快慢指標來操作,找到中點後,要以中點的值建立一個數的根節點,然後需要把原連結串列斷開,分為前後兩個連結串列,都不能包含原中節點,然後再分別對這兩個連結串列遞迴呼叫原函式,分別連上左右子節點即可
方法一:
C++解法:
/** * 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) 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; } };
java解法:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public TreeNode sortedListToBST(ListNode head) { if (head==null) return null; if (head.next==null) return new TreeNode(head.val); ListNode slow = head; ListNode fast = head; ListNode last = slow; while (fast.next!=null && fast.next.next!=null) { 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; } }