1. 程式人生 > 其它 >109. 有序連結串列轉換二叉搜尋樹

109. 有序連結串列轉換二叉搜尋樹

109. 有序連結串列轉換二叉搜尋樹

給定一個單鏈表的頭節點 head ,其中的元素 按升序排序 ,將其轉換為高度平衡的二叉搜尋樹。

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

示例 1:

輸入: head = [-10,-3,0,5,9]
輸出: [0,-3,9,-10,null,5]
解釋: 一個可能的答案是[0,-3,9,-10,null,5],它表示所示的高度平衡的二叉搜尋樹。

示例 2:

輸入: head = []
輸出: []

提示:

  • head 中的節點數在[0, 2 * 104] 範圍內
  • -105 <= Node.val <= 105

思路:

​ 首先,構造一個BST需要做到樹的左節點的值都小於根節點,右節點值都大於根節點。可以吧連結串列轉化為陣列進行操作

​ 需要保證高度差不超過1,那麼每次取中間值即可。

class Solution {
public:
    TreeNode* sortedListToBST(ListNode* head) {
        if(head==nullptr)return nullptr;
        vector<int>v;//儲存節點值
        ListNode* p=head;
        while(p!=nullptr){
            v.push_back(p->val);
            p=p->next;
        }
        //使用陣列構造高度平衡的二叉樹
        return buildBST(v,0,v.size()-1);
    }
    TreeNode* buildBST(vector<int>&v,int left,int right){
        if(left>right)return  nullptr;//越界就為空節點
        int mid=left+(right-left)/2;//取中間值
        TreeNode* root=new TreeNode(v[mid]);
        root->left=buildBST(v,left,mid-1);
        root->right=buildBST(v,mid+1,right);
        return root;
    }
};