对有序数组生成高度最低的二叉搜索树

给一个有序的数组,升序,没有重复的数字,生成一个高度最小的二叉搜索树。

二叉搜索树具有的特点就是左边节点的值比当前节点的小,右边节点的值比当前节点的大。而一个有序数组,恰恰是二叉搜索树的中序遍历结果。

扯了点没用的,想要高度低,就要尽可能的平衡,左右两个子树尽可能的平衡,那么,数组中间的数就是根节点了。左边的树就是数组中间左边的半个数组组成的,右边的树就是数组右边的半个数组组成的。这一段描述,是一个递归的过程,按照这个思路,代码也就有了。

class TreeNode<T>
{
    public TreeNode<T> Left { get; set; }
    public TreeNode<T> Right { get; set; }
    public T Data { get; set; }
}

static TreeNode<T> CreateMinimalBst<T>(T[] arr, int begin, int end)
{
    if (begin >= end)
    {
        return null;
    }

    int mid = (end - begin) / 2 + begin;
    var node = new TreeNode<T>();
    node.Data = arr[mid];
    node.Left = CreateMinimalBst(arr, begin, mid);
    node.Right = CreateMinimalBst(arr, mid + 1, end);

    return node;
}

static TreeNode<T> CreateMinimalBst<T>(T[] arr)
{
    return CreateMinimalBst(arr, 0, arr.Length);
}

O(n)的时间复杂度就搞定了这个题目,空间复杂度呢?表面看来,没有使用额外的存储空间,但是递归导致栈空间的增长,O(lg(n))。