本题的解题思路是,每次使用数组的中间元素来创建节点,然后递归的用中间元素左侧的元素和右侧的元素来创建左右子节点。
- 这里选择每次传入的区间为左闭右开区间,每次中间值 mid = left + (right - left) / 2 这样取中间值是为了防止 left + right 溢出
- 然后左子节点使用 [ left, mid ]这个下标范围来构造,右子节点使用[ mid + 1, right ]这个下标范围来构建。
代码如下:
/**
* 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* setBST(vector<int>& nums, int left, int right){
if(left >= right){
return nullptr;
}
if(right - left == 1){
TreeNode* root = new TreeNode(nums[left]);
return root;
}
int mid = left + (right - left) / 2;
TreeNode* root = new TreeNode(nums[mid]);
root->left = setBST(nums, left, mid);
root->right = setBST(nums, mid + 1, right);
return root;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
return setBST(nums, 0, nums.size());
}
};