1. 程式人生 > >109,有序連結串列轉換為二叉搜尋樹

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;        } }