考虑我有一个数组[3,18,15,25,26]
,可以从中形成多少个可能的二叉搜索树?
答案 0 :(得分:15)
在看了MicSim链接的问题之后,我仍然不满意,所以我开始自己查看。这就是我想出来的......
每棵树都可以被认为是具有父根节点的两棵树。如果您分别知道两个子分支的可能组合的数量,则具有该根节点的总组合是子组合的乘积。
我们可以通过首先解决较低的计数实例来开始构建更高计数的解决方案。
我将使用C(n)
来表示n个节点的总可能组合,即加泰罗尼亚数字。
希望这两个显而易见:
C(0) = 1
C(1) = 1
C(2)也很明显,但它可以构建,所以让我们这样做。有两种方法可以选择根节点。一个留下1:0
和另一个0:1
的子计数(左:右)。所以,第一种可能性是C(1)*C(0) = 1*1 = 1
。第二个是C(0)*C(1) = 1*1 = 1
。总结这些给我们
C(2) = 2
没有什么太令人兴奋了。现在让我们做3个节点。有3种方法可以选择根节点,因此有3种子组。您可能的群组是2:0
,1:1
和0:2
。
根据我们之前的定义,C(3)
可以写为C(2)*C(0) + C(1)*C(1) + C(0)*C(2) = 2*1 + 1*1 + 1*2 = 2+1+2 = 5
。
C(3) = 5
4个节点的子组分为3:0
,2:1
,1:2
和0:3
。因此,C(4)
可以写为C(3)*C(0) + C(2)*C(1) + C(1)*C(2) + C(0)*C(3) = 5*1 + 2*1 + 1*2 + 1*5 = 5+2+2+5 = 14
。
C(4) = 14
希望有两件事情开始变得明显。首先,这将很快变得麻烦。其次,我所描述的,以相当冗长的方式,是维基页面上的递归关系表示。
我不知道这是否有帮助,但它帮助我完成了练习,所以我想我会分享。我开始时并没有尝试重新创建递归关系,所以我的结果与现有方法之一相匹配是很好的。
答案 1 :(得分:7)
可以使用N个键创建的二叉搜索树的可能数量由第N catalan number个给出。
答案 2 :(得分:5)
阵列的任何节点都可以是BST的根,并且对于每个根,不同搜索树的数量是左和右子阵列的组合(乘积)。所以,
BSTCount(0) = 1
BSTCount(n) = sum_{i = 1}^{n} BSTCount(i-1) * BSTCount(n-i)
您可以为前几个n评估此函数,然后在On-Line Encyclopedia of Integer Sequences™ (OEIS)中查找序列以查找已关闭的表单。