109有序链表转换二叉搜索树

109. 有序链表转换二叉搜索树

下面是题目给出的模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* 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) {

};

对于这题,最简单的就是递归构建树

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//首先我们写一个构造树的函数,通过递归来实现。 
//然后用vector存储链表,用来构建树
//因为已经是升序链表了,所以没必要再排序,如果是无序链表构建二叉搜索树,我们需要对vector进行再排序
class Solution {
public:
TreeNode* sortedListToBST(ListNode* head) {
vector<int> v;
//建立一个数组来存储所有的数据
ListNode *cur = head;
while(cur)
{
v.push_back(cur->val);
cur = cur->next;
}
//用递归来解决
return buildTree(v,0,v.size());
}
TreeNode* buildTree(vector<int> v,int begin,int end)
{
if(begin==end)return NULL;
int middle = (begin+end)/2;
TreeNode *root = new TreeNode(v[middle]);
root->left = buildTree(v,begin,middle);
root->right = buildTree(v,middle+1,end);
return root;
}
};

但是上面这种方法消耗了很多时间和空间,能不能用更快的方法呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 [-10, -3, 0, 5, 9]
class Solution {
public:
TreeNode* sortedListToBST(ListNode* head) {
if (!head) return 0;

ListNode* p = head;
ListNode* q = p;
ListNode* pre = 0;
//利用快慢指针,找到链表的中间节点
while (q && q->next) {
q = q->next->next;
pre = p;
p = p->next;
}
//这时候,pre是p的前驱,pre为-3,p为0
if (pre) pre->next = 0;
TreeNode* root = new TreeNode(p->val);
node->left = sortedListToBST(head == p ? pre : head);
node->right = sortedListToBST(p->next);//继续递归
return root;
}
};
-------------本文结束,感谢您的阅读-------------