一.题目
Convert Sorted List to Binary Search Tree
Total Accepted: 42911 Total Submissions: 153626 My SubmissionsGiven a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
Show Tags
Have you met this question in a real interview?
Yes
No
二.解题技巧
这道题只要将列表转化为一个数组,就可以使用Convert Sorted Array to Binary Search Tree相同的方法来进行,这种方法的时间复杂度为O(n),空间复杂度为O(n^2)。
三.实现代码
#include <iostream>
#include <vector>
using std::vector;
/**
* 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) {}
* };
*/
struct ListNode
{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution
{
private:
TreeNode* sortedArrayToBST(vector<int>::iterator Begin,
vector<int>::iterator End)
{
if (Begin == End)
{
return NULL;
}
vector<int>::iterator HeadIte = Begin + (End - Begin) / 2;
TreeNode *Head = new TreeNode(*HeadIte);
TreeNode *LeftChild = sortedArrayToBST(Begin, HeadIte);
TreeNode *RightChild = sortedArrayToBST(HeadIte + 1, End);
Head->left = LeftChild;
Head->right = RightChild;
return Head;
}
public:
TreeNode* sortedListToBST(ListNode* head)
{
vector<int> Nums;
for (ListNode *TmpHead = head; TmpHead; TmpHead = TmpHead->next)
{
Nums.push_back(TmpHead->val);
}
return sortedArrayToBST(Nums.begin(), Nums.end());
}
};
四.体会
这道题只要将列表转化为一个数组,就可以使用Convert Sorted Array to Binary Search Tree相同的方法来进行,方法还是很简单,但是还存在可提升的空间,还需要后续的改进。
版权所有,欢迎转载,转载请注明出处,谢谢
