思路
二叉搜索树(BST)的核心性质是:任意节点的左子树所有值 <该节点值 < 右子树所有值;
而 "高度平衡" 要求每个节点的左右子树高度差不超过 1。
解题过程
每次选取数组的中间元素作为当前子树的根节点(保证左右子树节点数量尽可能均衡,从而满足平衡要求);
递归地用左半部分数组构建左子树,右半部分数组构建右子树;直到数组区间为空时终止递归。
复杂度
时间复杂度: O (n)
空间复杂度: O (n)
核心代码
cpp
/**
* 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* DFS(vector<int>& nums,int left,int right){
if(left==right) return NULL;// 终止条件:左闭右开区间[left, right)为空,返回空节点
int n=left+(right-left)/2;// 计算中间位置,避免left+right溢出,等价于(left+right)/2但更安全
// 1. 以中间元素为根节点值
// 2. 递归构建左子树(区间[left, n))
// 3. 递归构建右子树(区间[n+1, right))
return new TreeNode(nums[n],DFS(nums,left,n),DFS(nums,n+1,right));
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
// 初始调用DFS,处理整个数组(区间[0, nums.size()))
return DFS(nums,0,nums.size());
}
};