0%

convert-sorted-list-to-binary-search-tree

题目描述

给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1

题解

链表,相比于上一题的数组,有什么区别呢?不好找节点了啊……

用两个指针,一块一慢,快的每次走两步,慢的每次走一步,这样当快指针遍历结束时,慢指针指向的也就是链表的中间位置。这时候把中间位置的结点的值作为二叉搜索树当前结点的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
TreeNode* ListToBST(ListNode* head, ListNode* tail){
if (head==tail)return NULL;
if (head->next==tail)return new TreeNode(head->val);
ListNode *p, *q;
p = head; q = head;
while (q != tail) {
if (q->next == tail)break;
p = p->next;
q = q->next->next;
}
TreeNode* root = new TreeNode(p->val);
root->left = ListToBST(head, p);
root->right = ListToBST(p->next, tail);
return root;
}
TreeNode* sortedListToBST(ListNode* head) {
if (!head)return NULL;
if (!head->next)return new TreeNode(head->val);
return ListToBST(head, NULL);
}

要学会用双指针。改的好看点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
TreeNode* ListToBST(ListNode* head, ListNode* tail)
{
if (head==tail)return NULL;
ListNode *p, *q;
p = head; q = head;
while (q!=tail&&q->next!=tail){
p = p->next;
q = q->next->next;
}
TreeNode* root = new TreeNode(p->val);
root->left = ListToBST(head, p);
root->right = ListToBST(p->next, tail);
return root;
}
TreeNode* sortedListToBST(ListNode* head) {
return ListToBST(head, NULL);
}

不过上面的代码效率也太低了,去学个好的来。空间换时间?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
TreeNode* sortedListToBST(ListNode* head) {
vector<int> v;
while(head != nullptr){
v.push_back(head->val);
head = head->next;
}
return buildTree(v, 0, v.size());
}
TreeNode * buildTree(vector<int> & v, int begin, int end){
if(begin == end) return nullptr;
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;
}

https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/solution/c-2chong-jie-fa-bu-yong-duan-kai-lian-biao-by-alex/

还是慢。那就不是我的问题了。

偷懒了好几天实在抱歉,从今天开始继续吧。