给定一个元素各不相同的有序序列int[] vals(升序排列),请编写算法创建一棵高度最小的二叉查找树,并返回二叉查找树的高度。
//思路:取有序数组中间数值作为二叉搜索树的根,这样高度最小。确定根之后,递归依次确定根的左子树的根,右子树的根。。。
/*struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int data) :val(data),left(NULL),right(NULL) {}
};*/
class MinimalBST {
public:
    TreeNode *buildBST(vector<int> vals,int left,int right) {
        if (left > right)
            return NULL;
        int middle = left + (right - left)/2;
        TreeNode *root = new TreeNode(vals[middle]);
        root->left = buildBST(vals,left,middle-1);
        root->right = buildBST(vals,middle+1,right);
        
        return root;
        
    }
    
    int highBST(TreeNode *root) {
        if (root == NULL)
            return 0;
        int left = highBST(root->left);
        int right = highBST(root->right);
        if (left > right)
            return left + 1;
        else
            return right + 1;
    }
    int buildMinimalBST(vector<int> vals) {
        // write code here
        int length = vals.size();
        if (length <= 0)
            return 0;
        TreeNode *root = buildBST(vals,0,length-1);
        return highBST(root);
    }
};
import java.util.*;
public class MinimalBST {
    
    public int build(int[] vals, int start, int end) {
        if (end <= start) {
            return 1;
		}
        int mid = (start + end) >> 1;
        int height1 = 1 + build(vals, start, mid - 1);
        int height2 = 1 + build(vals, mid + 1, end);
        return Math.max(height1, height2);
        
    }
    
    public int buildMinimalBST(int[] vals) {
        // write code here
        if (vals == null || vals.length < 1)
            return 0;
        return build(vals, 0, vals.length - 1);
    }
}
//虽然可以直接公式算高度,不过也写了个建树顺便算高度的
class MinimalBST {
public:
    int buildMinimalBST(vector<int> vals) {
        int height = 0;//初始化
        buildMinimalBST(vals, 0, vals.size() - 1, height);
        return height;
    }
    TreeNode* buildMinimalBST(vector<int> vals, int start, int end, int& height){
        if(start > end){//递归终止条件
            height = 0;
            return NULL;
        }
        int mid = start + (end - start) / 2;
        TreeNode *root = new TreeNode(vals[mid]);//根节点
        int left, right;//左右子树
        root->left = buildMinimalBST(vals, start, mid - 1, left);//左子树
        root->right = buildMinimalBST(vals, mid + 1, end, right);//右子树
        height = (left >= right ? left : right) + 1;//计算当前高度
        return root;
    }
};
import java.util.*;
public class MinimalBST {
    public int buildMinimalBST(int[] vals) {
        // write code here
        if(vals.length == 0){
            return 0;
        }
        int length = vals.length;
        TreeNode node = build(vals,0,length - 1);
        return max(node);
    }
    public TreeNode build(int[] vals,int left,int right){
        if(left > right){
            return null;
        }
        int mid = left + (right - left)/2;
        TreeNode root = new TreeNode(vals[mid]);
        root.left = build(vals,left,mid - 1);
        root.right = build(vals,mid+1,right);
        return root;
    }
    public int max(TreeNode root){
        if(root == null){
            return 0;
        }
        int left = max(root.left) + 1;
        int right = max(root.right) + 1;
        return Math.max(left,right);
    }
}
 class MinimalBST {
public:
    int buildMinimalBST(vector<int> vals) {
        if (vals.size() == 0) return 0;
        return log2(vals.size()) + 1;
    }
}; class MinimalBST: def buildMinimalBST(self, vals): # write code here if not vals: return 0 return self.build(vals,0,len(vals)-1) def build(self,vals,start,end): if end<start:return 0 if end==start:return 1 mid = start + (end - start) / 2 height1 = 1+self.build(vals,start,mid-1) height2 = 1+self.build(vals,mid+1,end) return max(height1,height2)
class MinimalBST {
private:
    TreeNode* build(vector<int>& vals, int l, int r)
    {
        if(l > r)
            return NULL;
        int mid = l + (r-l)/2;
        TreeNode* head = new TreeNode(vals[mid]);
        head->left = build(vals,l,mid-1);
        head->right = build(vals,mid+1,r);
        return head;
    }
    
    int depth(TreeNode* root)
    {
        if(!root)
            return 0;
        return max(depth(root->left),depth(root->right))+1;
    }
public:
    int buildMinimalBST(vector<int> vals) {
        TreeNode* root = build(vals,0,vals.size()-1);
        return depth(root);
    }
}; //当然最简单方法就是返回log2(vals.size())+1
class MinimalBST {
    struct TreeNode
    {
        int val;
        TreeNode *left,*right;
        TreeNode(int v):val(v),left(nullptr),right(nullptr){}
    };
public:
    int buildMinimalBST(vector<int> vals) {
        if(vals.size()<=0) return 0;
        int size=vals.size();
        TreeNode *root=CreateBST(vals,0,size-1);
        return GetHeight(root);
    }
private:
    TreeNode* CreateBST(vector<int>&arr,int left,int right)
    {
        if(left>right)
            return nullptr;
        int mid=left+(right-left)/2;
        TreeNode *root=new TreeNode(arr[mid]);
        root->left=CreateBST(arr,left,mid-1);
        root->right=CreateBST(arr,mid+1,right);
        return root;
    }
    int GetHeight(TreeNode *root)
    {
        if(root==nullptr) return 0;
        return max(GetHeight(root->left),GetHeight(root->right))+1;
    }
};
 class MinimalBST {
public:
    int buildMinimalBST(vector<int> vals) {
        int h = 0;
        helper(vals, 0, vals.size()-1, 0, h);
        return h;
    }
private:
    TreeNode* helper(const vector<int>& vals, int s, int e, int cnt, int& h){
        if(s > e) return NULL;
        int mid = s + (e-s)/2;
        TreeNode* node = new TreeNode(vals[mid]);
        if(++cnt > h) h = cnt;
        node->left = helper(vals, s, mid-1, cnt, h);
        node->right = helper(vals, mid+1, e, cnt, h);
        return node;
    }
}; import java.util.*;
public class MinimalBST {
    public int buildMinimalBST(int[] vals) {
        // write code here
        return build(vals, 0, vals.length - 1);
    }
    
    private int build(int[] vals, int start, int end) {
        if (end < start) {
            return 0;
        } else {
            int mid = (start + end) / 2;
            int leftHeight = build(vals, start, mid - 1);
            int rightHeight = build(vals, mid + 1, end);
            return Math.max(leftHeight, rightHeight) + 1;
        }
    }
}
                                                                                    import java.util.*;
public class MinimalBST {
    
     public int buildMinimalBST(int[] vals) {
         if(vals == null || vals.length <1)
            return 0;
         return buildMinimalBSTCore(vals, 0 , vals.length-1);
     }
    public int buildMinimalBSTCore(int[] vals, int start, int end) {
        if(end < start)
            return 0;
        int mid = (start + end)/2;
        int leftH = 1 + buildMinimalBSTCore(vals, start, mid-1);
        int rightH = 1 + buildMinimalBSTCore(vals, mid+1, end);
        
        return Math.max(leftH, rightH);
    }
}