Algorithm 给定一个排序整数数组,如何从中形成二进制搜索树?

Algorithm 给定一个排序整数数组,如何从中形成二进制搜索树?,algorithm,data-structures,binary-search-tree,catalan,Algorithm,Data Structures,Binary Search Tree,Catalan,假设我有一个数组[3,18,15,25,26],那么从它可以形成多少个可能的二进制搜索树 可以使用N个键创建的二进制搜索树的可能数量由第N个键给出 另请参见此问题:阵列的任何节点都可以是BST的根,对于每个根,不同的搜索树的数量是左右子阵列的组合(乘积)。所以 BSTCount(0) = 1 BSTCount(n) = sum_{i = 1}^{n} BSTCount(i-1) * BSTCount(n-i) 您可以对该函数的前几个n进行求值,然后在中查找序列以找到一个封闭形式。在查看了由Mi

假设我有一个数组
[3,18,15,25,26]
,那么从它可以形成多少个可能的二进制搜索树

可以使用N个键创建的二进制搜索树的可能数量由第N个键给出


另请参见此问题:

阵列的任何节点都可以是BST的根,对于每个根,不同的搜索树的数量是左右子阵列的组合(乘积)。所以

BSTCount(0) = 1
BSTCount(n) = sum_{i = 1}^{n} BSTCount(i-1) * BSTCount(n-i)

您可以对该函数的前几个n进行求值,然后在中查找序列以找到一个封闭形式。

在查看了由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
希望有两件事开始变得显而易见。首先,这将很快开始变得麻烦。第二,我以一种相当冗长的方式描述了wiki页面上的递归关系表示


我不知道这是否有帮助,但它帮助我完成了这个练习,所以我想我应该和大家分享一下。开始时,我没有尝试重新创建递归关系,因此我的结果与现有方法中的一种相匹配,这很好。

这是家庭作业吗?你在寻找平衡的BST吗?:)不,这不是家庭作业。不,这不是平衡的BST.Thanx解释。那真的很有帮助。谢谢迈克。真的很有帮助。我被这个问题难住了。经过这一解释,我能够实现解决方案。@Amberbereriwal-我发现将问题分解为基本部分总是有帮助的。很高兴它对你有用。:)