首先要比较清楚搜索树的概念,搜索树就是左子树上所有的节点均小于当前节点,而右子树所有的节点均大于该节点,因为数组是有序的,只需要根据每次寻找处于中间的下标即可保证左子树和右子树的条件满足。另外要清楚平衡二叉树的概念,每个节点的左子树和右子树的高度差的绝对值不超过1,清楚这些概念我们就会发现用分治的方式很容易解决该问题。
TreeNode*ArrayToBST(std::vector<int>nums,int s,int t){
if(s==t){
TreeNode*root=new TreeNode(nums[s]);
return root;
}
int m=(s+t)/2;
TreeNode*root=new TreeNode(nums[m]);
if(m-1<0)
m=0;
if(m!=s&&m!=t){
root->left=ArrayToBST(nums,s,m-1);
root->right=ArrayToBST(nums,m+1,t);
}
else if(m!=s&&m==t){
root->left=ArrayToBST(nums,s,m-1);
}
else if(m==s&&m!=t){
root->right=ArrayToBST(nums,m+1,t);
}
return root;
}
TreeNode* sortedArrayToBST(std::vector<int>& nums) {
if(nums.size()==0)return NULL;
int a=nums.size();
return ArrayToBST(nums,0, a-1);
}