Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
这个问题比较容易想到O(nlogn)的方法,通过链表的计数来找到一个序列的中间节点。不过,存在一个更加高效的方法,可以优化到O(n)。
这个方法有点不容易想到。之前做过的用排好序的数组元素构造balanced BST,是通过下表找中间元素,从上到下建立树。通过链表找中间元素只能通过计数。但如果可以有一种方法可以只经历一次遍历链表,合理利用当前的计数值,就可以安排好各个节点分别在树的什么位置,就可以实现O(n)的时间复杂度。从下往上建立树能够做到。
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 // Start typing your C/C++ solution below 22 // DO NOT write int main() function 23 int n = 0; 24 ListNode * h = head; 25 while(h != NULL) 26 { 27 n++; 28 h = h->next; 29 } 30 return makeTree(0,n-1,head); 31 } 32 TreeNode * makeTree(int l,int r,ListNode * & head) 33 { 34 if(l > r) 35 return NULL; 36 TreeNode * root; 37 if(l == r) 38 { 39 root = new TreeNode(head->val); 40 head = head->next; 41 return root; 42 } 43 int mid = (l + r)/2; 44 TreeNode *leftChild = makeTree(l,mid - 1,head); 45 root = new TreeNode(head->val); 46 head = head->next; 47 TreeNode *rightChild = makeTree(mid + 1,r,head); 48 root->left = leftChild; 49 root->right = rightChild; 50 return root; 51 } 52 };

浙公网安备 33010602011771号