【问题标题】:Number of Binary Search Trees of a given Height给定高度的二叉搜索树的数量
【发布时间】:2015-10-31 08:37:47
【问题描述】:

对于给定的一组唯一数字,我如何找到最高给定高度 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;
    }
}

【问题讨论】:

  • 动态编程,一如既往。
  • 我知道如何使用动态编程计算由 n 个节点形成的 bst 总数。但是如果我们必须将树的高度限制在一个特定的数字。
  • 比如4个节点,bsts的数量是14个。但是我们想限制树的高度为3。现在树的数量会更少。
  • @DavidEisenstat 你能解释一下吗?
  • 按高度和节点数索引表格。

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


【解决方案1】:

您可以按照 cmets 中的 @DavidEisenstat 建议添加记忆功能来加快速度。

您创建一个记忆表来存储已计算结果的值。 在示例中,-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) 中执行,因为您将只为每对可能的nh 计算一次bst。这种技术的另一个优点是,一旦表格被填满,bst 将以 O(1) 响应(对于表格范围内的值)。 注意不要使用高于MAX_HMAN_N 的值调用该函数。另请记住,记忆化是一种内存时间权衡,这意味着您的程序运行速度会更快,但也会使用更多内存。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多