CC20:高度最小的BST

题目

对于一个元素各不相同且按升序排列的有序序列,请编写一个算法,创建一棵高度最小的二叉查找树。
给定一个有序序列int[] vals,请返回创建的二叉查找树的高度。

解法

这道题感觉如果没有创建树的话也能过,因为是二叉查找树,那最优的情况肯定就是按照满二叉树的方式去创建,那么只要简单计算一下层数就ok的,代码如下:

class MinimalBST {
public:
    int buildMinimalBST(vector<int> vals) {
        // write code here
       int length=vals.size();
       int height;
       if(length<=0)
        return 0;
        while(length)
        {
            ++height;
            length=length>>1;
        }
        return height;
    }
};

如果是按照规矩来创建一个树来做的话,就需要这样:

struct TreeNode
{
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};
class MinimalBST
{
public:
    TreeNode* buildBST(vector<int>vals,int left,int right,int *depth)
    {
        if(left>right)
        {
            *depth=0;
            return NULL;
        }
        if(left==right)
        {
            *depth=1;
            TreeNode* root=new TreeNode(vals[left]);
            root->left=root->right=NULL;
            return root;
        }
        else
        {
            int mid=(left+right)/2;
            int begin,end;
            TreeNode *root=new TreeNode(vals[mid]);
            root->left=buildBST(vals,left,mid-1,&begin);
            root->right=buildBST(vals,mid+1,right,&begin);
            *depth=1+(begin>end?begin:end);
            return root;
        }
    }
    int buildMinimalBST(vector<int> vals)
    {
        int left=0,right=vals.size(),depth=0;
        if(right==0)
            return 0;
        buildBST(vals,left,right,&depth);
    }
};
posted @ 2018-07-24 11:46  MrYun  阅读(227)  评论(0)    收藏  举报