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个信誉点,您甚至可以编辑其他。。