假设我有一个正数的链表,可以从中生成多少个BST,只要所有节点都需要形成树?
相反,如果这些树中存在任何数量的链表节点,可以生成多少个BST?
奖励:可以形成多少平衡的BST?非常感谢任何帮助或指导。
答案 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。