题目描述
对于一个元素各不相同且按升序排列的有序序列,请编写一个算法,创建一棵高度最小的二叉查找树。
对于一个元素各不相同且按升序排列的有序序列,请编写一个算法,创建一棵高度最小的二叉查找树。
给定一个有序序列int[] vals,请返回创建的二叉查找树的高度。
注意:这只是求高度最小的二叉查找树,不是真的要构建一颗树,完全二叉树的高度最小。为log2^n + 1
//第一种方式,二分法,非递归写法。
int BuildMinimalBST(vector<int> vals)
{
int left = 0;
int right = vals.size()-1;
int count = 0;
while(left <= right)
{
count++;
int mid = left+( (right-left) >> 1);
if(mid-left < right-mid) //左区间中的元素小于右区间中的元素。
{
left = mid + 1;
}
else //左区间中的元素个数大于右区间中的元素个数。
{
right = mid - 1;
}
}
return count;
}
//第二种方式:递归写法。
int CreateMinBST(int start,int end)
{
if(start > end)
return 0;
int mid = start+( (end - start) >> 1);
int left = CreateMinBST(start,mid-1);
int right = CreateMinBST(mid+1,end);
return left > right ? left+1 : right+1;
}
int BuildMinimalBST(vector<int> vals)
{
return CreateMinBST(0,vals.size()-1);
}