将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
解析:题目要求高度平衡,并且要求是二叉搜索树。
根据二叉搜索树的性质以及题目给定的升序有序数组,可以得出,对于数组中一个给定的区间,这个区间中间的数字一定是这个区间所转换的树的根节点,而这个数字左侧的其他数字对应构成根节点的左子树,右侧同理构成右子树。
再根据高度平衡的要求,可以得出,对于一个给定的区间,为了实现高度平衡,必须从中间切分以实现左右数字数量大致相等以实现高度平衡。
因此得出算法。
构造递归函数,每次选取当前区间中间的数字构造一个节点,并递归的调用自身以构造左右子树。当区间不存在时返回空指针。
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
return makenode(nums,0,nums.size()-1);
}
TreeNode* makenode(vector<int>& nums,int start,int end){
if(start>end) return nullptr;
int mid = start + (end-start)/2;
TreeNode* cur = new TreeNode(nums[mid]);
cur->left = makenode(nums,start,mid-1);
cur->right = makenode(nums,mid+1,end);
return cur;
}
};