给定高度的二叉搜索树的数量

时间:2015-08-07 19:48:39

标签: algorithm binary-tree binary-search-tree dynamic-programming combinatorics

如何找到达到给定高度h的BST数量,并丢弃高度大于h的所有BST,以获得给定的一组唯一数字?

我使用递归方法编写了代码

static int bst(int h,int n){
    if(h==0&&n==0)return 1;
    else if(h==0&&n==1)return 1;
    else if(h==0&&n>1)return 0;
    else if(h>0&&n==0)return 1;
    else{
        int sum=0;
        for(int i=1;i<=n;i++)
            sum+=bst(h-1,i-1)*bst(h-1,n-i);
        return sum;
    }
}

1 个答案:

答案 0 :(得分:0)

您可以通过在评论中建议的@DavidEisenstat添加备忘录来加快速度。

您可以创建一个memoization表来存储已计算结果的值。 在示例中,-1表示尚未计算该值。

c ++中的示例

long long memo[MAX_H][MAX_N];

long long bst(int h,int n){
    if(memo[h][n] == -1){
        memo[h][n] = //Compute the value here using recursion
    }
    return memo[h][n];
}

...

int main(){
    memset(memo,-1,sizeof memo);
    bst(102,89);
}

这将在O(h*n)中执行,因为您只会为每对bstn计算一次h。该技术的另一个优点是,一旦表填满,bst将以O(1)响应(对于表格范围内的值)。 请注意不要使用高于MAX_HMAN_N的值来调用该函数。另外请记住,memoization是一个记忆时间的权衡,意味着你的程序运行得更快,但它也会使用更多的内存。

更多信息:https://en.wikipedia.org/wiki/Memoization