BST的数量给出一个链接的数字列表

时间:2012-02-11 05:52:02

标签: binary-search-tree

假设我有一个正数的链表,可以从中生成多少个BST,只要所有节点都需要形成树?

相反,如果这些树中存在任何数量的链表节点,可以生成多少个BST?

奖励:可以形成多少平衡的BST?非常感谢任何帮助或指导。

1 个答案:

答案 0 :(得分:0)

您可以使用动态编程来计算它。

请注意,这些数字是多少都无关紧要。换句话说,对于任何n个不同的整数,存在相同数量的不同BST。我们称这个数字为f(n)。

然后,如果你知道k(k)为k <你可以得到f(n):

f(n) = Sum ( f(i) + f(n-1-i), i = 0,1,2,...,n-1 )

每个加数表示第(1 + i)个最小数位于根的树的数量(因此在左子树中,其中是i个数,而在右子树中有n-1-i)。 因此DP解决了这个问题。

现在BST的总数(包含列表中的任何节点)只是一个总和:

Sum ( Binomial(n,k) * f(k), k=1,2,3,...,n )

这是因为您可以Binomial(n,k)方式选择其中的k个,然后您知道它们有f(k)个BST。