Build a Balanced BST From a Sorted Array
Problem
Given an integer array sorted in ascending order, build a height-balanced binary search tree.
Recurse over [lo, hi]. Pick mid = (lo + hi) / 2 as the subtree root, recurse on [lo, mid - 1] for the left subtree, and [mid + 1, hi] for the right. The number of elements on either side of mid differs by at most one, so every subtree is balanced by construction.
Input
nums = [-10, -3, 0, 5, 9]Output
tree rooted at 0 with children -10/-3 left, 5/9 rightMid index 2 → 0 root; left half [-10, -3] → -3 root; right half [5, 9] → 9 root.
def sorted_to_bst(nums):
def build(lo, hi):
if lo > hi: return None
mid = (lo + hi) // 2
node = TreeNode(nums[mid])
node.left = build(lo, mid - 1)
node.right = build(mid + 1, hi)
return node
return build(0, len(nums) - 1)
function sortedToBST(nums) {
function build(lo, hi) {
if (lo > hi) return null;
const mid = (lo + hi) >> 1;
const node = { val: nums[mid], left: null, right: null };
node.left = build(lo, mid - 1);
node.right = build(mid + 1, hi);
return node;
}
return build(0, nums.length - 1);
}
public TreeNode sortedToBST(int[] nums) {
return build(nums, 0, nums.length - 1);
}
TreeNode build(int[] a, int lo, int hi) {
if (lo > hi) return null;
int mid = (lo + hi) >>> 1;
TreeNode node = new TreeNode(a[mid]);
node.left = build(a, lo, mid - 1);
node.right = build(a, mid + 1, hi);
return node;
}
TreeNode* build(vector<int>& a, int lo, int hi) {
if (lo > hi) return nullptr;
int mid = (lo + hi) / 2;
TreeNode* node = new TreeNode(a[mid]);
node->left = build(a, lo, mid - 1);
node->right = build(a, mid + 1, hi);
return node;
}
TreeNode* sortedToBST(vector<int>& nums) {
return build(nums, 0, (int)nums.size() - 1);
}