Convert Sorted List to Binary Search Tree

Q:

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.

A:

只能想到递归的办法,但是找中点是一个很麻烦的事情,就先构造一个数组,然后再搞。速度上会稍微快一些。

/**
 * 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 *sortedListToBST(ListNode *head) {
    // Start typing your C/C++ solution below
    // DO NOT write int main() function
    vector<int> node_arr;
    ListNode* cur = head;
    while (cur) {
      node_arr.push_back(cur->val);
      cur = cur->next;
    }
    node_arr.resize(node_arr.size());
    return SortedArrayToBST(node_arr, 0, node_arr.size() - 1);
  }
 private:
  TreeNode* SortedArrayToBST(const vector<int>& arr, int begin, int end) {
    if (begin > end) return NULL;
    int mid = (end + begin) / 2;
    TreeNode* root = new TreeNode(arr[mid]);
    if (begin == end) return root;
    TreeNode* left = SortedArrayToBST(arr, begin, mid - 1);
    TreeNode* right = SortedArrayToBST(arr, mid + 1, end);
    root->left = left;
    root->right = right;
    return root;
  }
};

 

posted @ 2013-06-26 12:23  dmthinker  阅读(82)  评论(0)    收藏  举报