输入: 一个升序整数数组 nums。
要求: 将其转换为一棵高度平衡的二叉搜索树(BST)。
输出: 构造出的 BST 根节点 TreeNode*。
思路:
有序数组天生就是“BST 的中序遍历结果”。要构造一棵平衡 BST,关键就是让左右子树规模尽量接近。
做法非常固定:每次取区间中点作为根,左右两半分别递归构建左右子树。
递归函数 build(a, l, r) 的含义:
- 用数组区间
[l, r]构造一棵平衡 BST,并返回根节点。
单层逻辑:
- 若
l > r,说明区间为空,返回nullptr。 mid = l + (r - l) / 2作为根节点下标(防止溢出写法)。- 根节点值为
a[mid]。 - 左子树递归构建
[l, mid-1],右子树递归构建[mid+1, r]。
这样构造出来的树天然满足:
- BST 性质(左边都小于根,右边都大于根)
- 高度平衡(每层都尽量把节点均分)
复杂度:
- 时间复杂度:O(N)
- 每个元素只会被当作根创建一次。
- 空间复杂度:O(H)
- 递归栈深度,平衡情况下约为 O(log N)。
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
return build(nums, 0, (int)nums.size() - 1);
}
TreeNode* build(const vector<int>& a, int l, int r) {
if (l > r) return nullptr;
int mid = l + (r - l) / 2;
TreeNode* root = new TreeNode(a[mid]);
root->left = build(a, l, mid - 1);
root->right = build(a, mid + 1, r);
return root;
}
};
841

被折叠的 条评论
为什么被折叠?



