CoderJesse  
wangjiexi@CS.PKU

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

 

posted on 2013-03-01 13:07  CoderJesse  阅读(240)  评论(0)    收藏  举报