Fork me on GitHub

最小高度的BST

      加深对BST的构建过程及递归思想的理解。

/*****************************************************
* \file MinimalBST.cpp
* \date 2016/05/30 16:00

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

* \问题分析:
由于没有让给出树的构造过程,所以可以直接通过归纳的方式计算得出结果。但是在这里我们仍旧使用递归的方式模拟树的构建,并最终得到二叉搜索树。
题目中要求树的高度最小实际上是让构造一个平衡二叉树,或者说为了让左右两个子树的节点数量越接近越好。

///虽然可以直接公式算高度,不过也写了个建树顺便算高度的
*****************************************************/
#include <iostream>
using namespace std;
#include <vector>

struct TreeNode
{
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) :val(x), left(nullptr), right(nullptr){}
};
class MinimalBST {
public:
    TreeNode* buildBST(vector<int> _vals,int _left,int _right)
    {
        if (_left>_right)
        {
            return nullptr;
        }
        int mid = _left + (_right - _left) / 2;
        TreeNode* root = new TreeNode(_vals[mid]);
        root->left = buildBST(_vals, _left, mid - 1);
        root->right = buildBST(_vals, mid + 1, _right);
        return root;
    }
    int highBST(TreeNode* _root)
    {
        if (_root==nullptr)
        {
            return 0;
        }
        int left = highBST(_root->left);
        int right = highBST(_root->right);
        return left > right ? (left + 1) : (right + 1);
    }
    int buildMinimalBST(vector<int> vals) {
        // write code here
        if (vals.size()<=0)
        {
            return 0;
        }
        TreeNode* root = buildBST(vals,0,vals.size()-1);
        return highBST(root);
    }
};

 

posted @ 2016-05-30 16:39  ranjiewen  阅读(384)  评论(0编辑  收藏  举报