LeetCode(109):有序鏈表轉換二叉搜索樹


Medium!

題目描述:

給定一個單鏈表,其中的元素按升序排序,將其轉換為高度平衡的二叉搜索樹。

本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。

示例:

給定的有序鏈表: [-10, -3, 0, 5, 9],

一個可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面這個高度平衡二叉搜索樹:

      0
     / \
   -3   9
   /   /
 -10  5

解題思路:

這道題是要求把有序鏈表轉為二叉搜索樹,和之前那道Convert Sorted Array to Binary Search Tree 將有序數組轉為二叉搜索樹思路完全一樣,只不過是操作的數據類型有所差別,一個是數組,一個是鏈表。數組方便就方便在可以通過index直接訪問任意一個元素,而鏈表不行。由於二分查找法每次需要找到中點,而鏈表的查找中間點可以通過快慢指針來操作,可參見之前的兩篇博客Reorder List 鏈表重排序http://www.cnblogs.com/grandyang/p/4254860.htmlLinked List Cycle II 單鏈表中的環之二http://www.cnblogs.com/grandyang/p/4137302.html有關快慢指針的應用。找到中點后,要以中點的值建立一個數的根節點,然后需要把原鏈表斷開,分為前后兩個鏈表,都不能包含原中節點,然后再分別對這兩個鏈表遞歸調用原函數,分別連上左右子節點即可。

C++解法一:

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 /**
10  * Definition for binary tree
11  * struct TreeNode {
12  *     int val;
13  *     TreeNode *left;
14  *     TreeNode *right;
15  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
16  * };
17  */
18 class Solution {
19 public:
20     TreeNode *sortedListToBST(ListNode *head) {
21         if (!head) return NULL;
22         if (!head->next) return new TreeNode(head->val);
23         ListNode *slow = head;
24         ListNode *fast = head;
25         ListNode *last = slow;
26         while (fast->next && fast->next->next) {
27             last = slow;
28             slow = slow->next;
29             fast = fast->next->next;
30         }
31         fast = slow->next;
32         last->next = NULL;
33         TreeNode *cur = new TreeNode(slow->val);
34         if (head != slow) cur->left = sortedListToBST(head);
35         cur->right = sortedListToBST(fast);
36         return cur;
37     }
38 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM