1. 程式人生 > 其它 >刷題-力扣-108. 將有序陣列轉換為二叉搜尋樹

刷題-力扣-108. 將有序陣列轉換為二叉搜尋樹

108. 將有序陣列轉換為二叉搜尋樹

題目連結

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

題目描述

給你一個整數陣列 nums ,其中元素已經按 升序 排列,請你將其轉換為一棵 高度平衡 二叉搜尋樹。
高度平衡 二叉樹是一棵滿足「每個節點的左右兩個子樹的高度差的絕對值不超過 1 」的二叉樹。

示例 1:

輸入:nums = [-10,-3,0,5,9]
輸出:[0,-3,9,-10,null,5]
解釋:[0,-10,5,null,-3,null,9] 也將被視為正確答案:
![](https://img2020.cnblogs.com/blog/2151155/202108/2151155-20210806204717833-1699454210.png)

示例 2:

輸入:nums = [1,3]
輸出:[3,1]
解釋:[1,3] 和 [3,1] 都是高度平衡二叉搜尋樹。

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 按 嚴格遞增 順序排列

題目分析

  1. 根據題目描述,將有序陣列轉換為排序二叉樹
  2. 選擇陣列中間的值作為根節點,陣列兩邊的子陣列分別作為左右子樹
  3. 根據2中的思想,使用遞迴的演算法實現

程式碼

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        return recursion(nums, 0, nums.size() - 1);
    }

private:
    TreeNode* recursion(vector<int>& nums, int left, int right) {
        if (left > right) return nullptr;
        int mid = left + (right - left) / 2;
        TreeNode* root = new TreeNode(nums[mid]);
        root->left = recursion(nums, left, mid - 1);
        root->right = recursion(nums, mid + 1, right);
        return root;
    }

};