Convert Sorted List to Binary Search Tree

方法一:最简单的方法是将列表中的数字存储在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) {}
 * };
 */
class Solution {
public:
    TreeNode* sortedListToBST(ListNode* head) {
        vector<int> nums;
        for(; head != nullptr; head = head->next)
            nums.push_back(head->val);
        sort(nums.begin(), nums.end());
        
        return sortedToBST(nums, 0, nums.size());
    }
    
    TreeNode *sortedToBST(vector<int> &nums, int lt, int rt)
    {
        if(lt >= rt)
            return nullptr;
        
        int mid = (lt + rt) / 2;
        TreeNode *ret = new TreeNode(nums[mid]);
        ret->left = sortedToBST(nums, lt, mid);
        ret->right = sortedToBST(nums, mid+1, rt);
        
        return ret;
    }
};

方法二:基于列表遍历的方式,这里需要注意当遍历右子树时,lt=0而不是mid+1;

/**
 * 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) {
        int len = 0;
        ListNode dummy(-1);
        dummy.next = head;
        
        for(; head != nullptr; ++len, head = head->next);
        
        return sortedListToBST(dummy.next, 0, len);
    }
    
    TreeNode* sortedListToBST(ListNode *head, int lt, int rt)
    {
        if(lt >= rt)
            return nullptr;
        
        int mid = (lt + rt) / 2;
        
        ListNode *begin = head;
        for(int i=0; i<mid; head = head->next, ++i);
        
        TreeNode *ret = new TreeNode(head->val);
        ret->left = sortedListToBST(begin, lt, mid);
        ret->right = sortedListToBST(head->next, 0, rt-mid-1);
        
        return ret;
    }
};

 

posted @ 2017-04-17 20:42  chengcy  Views(116)  Comments(0)    收藏  举报