109. 有序鏈表轉換二叉搜索樹(Convert Sorted List to Binary Search Tree)

給定一個單鏈表,其中的元素按升序排序,將其轉換爲高度平衡的二叉搜索樹。

本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。

示例:

給定的有序鏈表: [-10, -3, 0, 5, 9],

一個可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面這個高度平衡二叉搜索樹:

      0
     / \
   -3   9
   /   /
 -10  5


/**
 * 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 {
    TreeNode* sortedArrayToBst(vector<ListNode*>&nums,int start,int end)
    {
        if(start==end)return NULL;
        int mid=start+(end-start)/2;
        TreeNode*bst=new TreeNode(nums[mid]->val);
        //if(start<end)
        
        //注意邊界
        bst->left=sortedArrayToBst(nums,start,mid);
        bst->right=sortedArrayToBst(nums,mid+1,end);
        
        return bst;
    }
public:

    //將鏈表轉化成vector<ListNode*> 或者vector<int>,處理
    TreeNode* sortedListToBST(ListNode* head) {
        if(head==NULL)
            return NULL;
        ListNode*node=head;
        vector<ListNode*>tmp;
        //將鏈表轉化成vector<ListNode*> 或者vector<int>,處理
        while(node)
        {
            tmp.push_back(node);
            node=node->next;
        }
        //注意邊界
        return sortedArrayToBst(tmp,0,tmp.size());


    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章