刷題-力扣-108. 將有序陣列轉換為二叉搜尋樹
阿新 • • 發佈:2021-08-06
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 按 嚴格遞增 順序排列
題目分析
- 根據題目描述,將有序陣列轉換為排序二叉樹
- 選擇陣列中間的值作為根節點,陣列兩邊的子陣列分別作為左右子樹
- 根據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; } };