Function vectorToList prototype trick credit to:
http://stackoverflow.com/questions/13547273/c11-defining-function-on-stdarraychar-n
Convert Sorted List to Binary Search Tree
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
#include <iostream>
#include <array>
using namespace std;
/**
* Definition for singly-linked list.*/
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
/**
* Definition for binary tree */
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
TreeNode* build(ListNode*& head, int start, int end){
//the head points to the first element initially
if (start > end) return NULL;
int mid = (start+end)/2;
TreeNode* leftChild = build(head, start, mid-1);
//assume the head will advance (mid-start) times
//after this above function returns, the head points to the middle element
TreeNode* root = new TreeNode(head->val);
root->left = leftChild;
head = head->next;//advance in the list
//now head points to the first element of the right half
root->right = build(head, mid+1, end);
//also, after this function returns, the head pointer
//advances (end-mid), and now points to the last element in the list
return root;
}
TreeNode *sortedListToBST(ListNode *head) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
ListNode* it = head;
int size = 0;
while(it){
++size;
it = it->next;
}
return build(head, 0, size-1);
}
};
template<size_t N> ListNode* vectorToList(array<int, N> const& num){
if (!N) return NULL;
ListNode* head = new ListNode(num[0]);
ListNode* it = head;
for(size_t ii = 1; ii < N; ++ii, it = it->next){
it->next = new ListNode(num[ii]);
}//for ii
return head;
}
int main(){
array<int,3> a={3,5,8};
ListNode* head = vectorToList(a);
Solution s;
TreeNode* root = s.sortedListToBST(head);
cout<<"OK"<<endl;
}
Since the length of the list is needed only for counting the list-head advance steps, a slightly different version is derived:
class Solution {
public:
TreeNode* build(ListNode*& head, int size){
if (size<=0) return NULL;
int half = size/2;
TreeNode* leftChild = build(head, half);
//assume the head will advance (mid-start) times
//after this function returns, now the head points to the middle element
TreeNode* root = new TreeNode(head->val);
root->left = leftChild;
head = head->next;
root->right = build(head, size - half - 1);
//also, after this function returns, the head pointer
//advances (end-mid), and now points to the last element of the list
return root;
}
TreeNode *sortedListToBST(ListNode *head) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
ListNode* it = head;
int size = 0;
while(it){
++size;
it = it->next;
}
return build(head, size);
}
};
No comments:
Post a Comment