Algorithm n个不同整数中有多少个唯一的BST?-我还是不清楚

Algorithm n个不同整数中有多少个唯一的BST?-我还是不清楚,algorithm,Algorithm,如果有人认为我应该编辑这个问题。。。只要向我建议如何编辑它,我会继续做下去。请不要侮辱我 我看到一篇有同样问题的帖子,并点击了一个链接。 我试图理解这个解释,但它还是把我弄糊涂了 下面是代码片段。有人能解释一下它到底是怎么工作的吗 int number_of_trees(int n) { int i, j; // Table to store results of subproblems int Trees[n+1]; // Initialize first t

如果有人认为我应该编辑这个问题。。。只要向我建议如何编辑它,我会继续做下去。请不要侮辱我

我看到一篇有同样问题的帖子,并点击了一个链接。 我试图理解这个解释,但它还是把我弄糊涂了

下面是代码片段。有人能解释一下它到底是怎么工作的吗

int number_of_trees(int n)
{
    int i, j;
    // Table to store results of subproblems
    int Trees[n+1];

    // Initialize first two values in table
    Trees[0] = Trees[1] = 1;

    for (i=2; i<=n; i++)
    {
        Trees[i] = 0;
        for (j=0; j<i; j++)
            Trees[i] += Trees[j] * Trees[i-j-1];
    }
    return Trees[n];
}
如果我们有n个不同的整数1,2,…,n,那么,如果根是1,我们就把问题简化为计算我们有多少可能构建右子树,因为左子树是空的,没有任何东西小于1。到目前为止,我们已经:

Trees[n] = Trees[n - 1] + ...
如果根是2,那么左子树必须是1,我们还要处理右子树。我们还将此添加到我们的公式中:

Trees[n] = Trees[n - 1] + Trees[n - 2] + ...
如果根为3,则左子树有两种可能:左子树为2,左子树为1;右子树为1。然后,对于这两种可能性中的每一种,我们可以用剩余的n-3个元素构建正确的子树:

Trees[n] = Trees[n - 1] + Trees[n - 2] + Trees[2] * Trees[n - 3] + ...
如果继续此推理,并定义T[0]=T[1]=1,则得到以下公式:

Trees[n] = sum{i = 0 to n - 1} of Trees[i] * Trees[n - i - 1]
因为对于每个根r,您可以用小于r的元素构建左子树,对于构建左子树的每个可能性,您可以用剩余元素构建右子树。所以你乘以这两个,得到一个固定根的答案。将所有固定根的答案相加,得到最终答案

您的代码实现了以下功能:

首先,我们将树[0]=Trees[1]=1。这意味着只有一个BST有0个节点,也只有1个BST有1个节点

第一个for循环然后迭代到n。这是必需的,因为我们的公式重用了以前的值,所以我们会从头计算这些值

内部for循环应用了以下公式:如果j+1是根,则有树[j]方法构建左子树,有树[i-j-1]方法构建右子树。这些可以以任何方式组合,所以你将它们相乘,得到i的答案


非常感谢您的回复!您可以通过单击此注释上方的“编辑”链接进行编辑。你可以随时编辑自己的帖子。超过2000个信誉点,您甚至可以编辑其他。。