The idea that root is the middle element gets you a “balanced” bst.
TreeNode* sortedArrayToBST(vector<int>& nums) {
int n = nums.size();
auto f = [&](auto&& f, int l, int r) -> TreeNode* {
if (l > r)
return nullptr;
int mid = (l + r) / 2;
TreeNode* root = new TreeNode(nums[mid]);
root->left = f(f, l, mid - 1);
root->right = f(f, mid + 1, r);
return root;
};
return f(f, 0, n - 1);
}