Algorithm 二叉搜索树的数目
有20个节点且元素为1,2,3,…,20的二叉搜索树的数目是多少,这样树的根是12,左子树的根是7? a) 2634240 b) 1243561 c) 350016 d) 2642640 一个解释和答案会很有帮助 我已经应用了加泰罗尼亚数字公式,但是选项的结果不合适,所以这只是为了确定。使用,计算带有Algorithm 二叉搜索树的数目,algorithm,data-structures,tree,Algorithm,Data Structures,Tree,有20个节点且元素为1,2,3,…,20的二叉搜索树的数目是多少,这样树的根是12,左子树的根是7? a) 2634240 b) 1243561 c) 350016 d) 2642640 一个解释和答案会很有帮助 我已经应用了加泰罗尼亚数字公式,但是选项的结果不合适,所以这只是为了确定。使用,计算带有n节点的完整二叉树,答案将是d)2642640=14*132*1430。这就是从每个未知子树扩展(子)树的可能性 12 / \ 7
n
节点的完整二叉树,答案将是d)2642640
=14*132*1430。这就是从每个未知子树扩展(子)树的可能性
12
/ \
7 (8 nodes)
/ \
(6 nodes) (4 nodes)
更新: 正如Mark Dickinson在下面的评论中所建议的,为了澄清:上图和第一个语句中提到的“节点”是“内部”节点,我们以各种方式排列,而
n
th Catalan数是用n+1
叶节点计算完整的二叉树 使用,计算带有n
节点的完整二叉树,答案将是d)2642640
=14*132*1430。这就是从每个未知子树扩展(子)树的可能性
12
/ \
7 (8 nodes)
/ \
(6 nodes) (4 nodes)
更新: 正如Mark Dickinson在下面的评论中所建议的,为了澄清:上图和第一个语句中提到的“节点”是“内部”节点,我们以各种方式排列,而
n
th Catalan数是用n+1
叶节点计算完整的二叉树 - 这基本上是希望您计算特定数量节点可能的唯一BST的数量
- 最后,最终结果将是这些数字的乘法
- 如果这是在考试中,那么你必须做乘法运算。否则,您可以使用
以编程方式解决此问题动态编程
class Solution {
public int numTrees(int n) {
if(n < 3) return n;
int[] dp = new int[n+1];
dp[0] = 1; // just initializing it as base case
dp[1] = 1;// meaning, only 1 possibility for 1 node.
dp[2] = 2;// meaning, only 2 possibilities for 2 nodes.
for(int i=3;i<=n;++i){
for(int j=1;j<=i;++j){
int nodes_on_left_of_j = j - 1;
int nodes_on_right_of_j = i - j;
dp[i] += dp[nodes_on_left_of_j] * dp[nodes_on_right_of_j]; // so multiply left side possibilites with right side possibilites for a particular root node.
}
}
return dp[n];
}
}
类解决方案{
公共整数树(整数n){
如果(n<3)返回n;
int[]dp=新的int[n+1];
dp[0]=1;//只是将其初始化为基本情况
dp[1]=1;//表示1个节点只有1种可能性。
dp[2]=2;//表示2个节点只有2种可能性。
对于(int i=3;i
- 这基本上是希望您计算特定数量节点可能的唯一BST的数量
- 最后,最终结果将是这些数字的乘法
- 如果这是在考试中进行的,那么您必须进行乘法运算。否则,您可以使用
动态编程
以编程方式解决此问题
代码:
class Solution {
public int numTrees(int n) {
if(n < 3) return n;
int[] dp = new int[n+1];
dp[0] = 1; // just initializing it as base case
dp[1] = 1;// meaning, only 1 possibility for 1 node.
dp[2] = 2;// meaning, only 2 possibilities for 2 nodes.
for(int i=3;i<=n;++i){
for(int j=1;j<=i;++j){
int nodes_on_left_of_j = j - 1;
int nodes_on_right_of_j = i - j;
dp[i] += dp[nodes_on_left_of_j] * dp[nodes_on_right_of_j]; // so multiply left side possibilites with right side possibilites for a particular root node.
}
}
return dp[n];
}
}
类解决方案{
公共整数树(整数n){
如果(n<3)返回n;
int[]dp=新的int[n+1];
dp[0]=1;//只是将其初始化为基本情况
dp[1]=1;//表示1个节点只有1种可能性。
dp[2]=2;//表示2个节点只有2种可能性。
对于(int i=3;i左子树的根是从7开始的,还是左子树本身是7,只有7你能展示你对加泰罗尼亚数字公式的应用吗?那么也许我们可以指出你错在哪里。顺便说一句,这在math.stackexchange.com
可能更合适,除非你希望通过实现某种f brute force search.左子树的根是7,它还有其他元素作为子元素。Cn=(2n)!/((n+1)!*n!);我使用了这个公式我在每个节点上都有值,总共有20个节点,值为12的节点是根,值为7的节点是值为12的节点的左子树的根。左子树的根是从7开始的,还是左树本身是7,只有7你能展示你对加泰罗尼亚数公式的应用吗也许我们可以指出您的错误所在。顺便说一句,在math.stackexchange.com
,这可能更合适,除非您希望通过实现某种暴力搜索来解决这个问题。左子树的根是7,它的子树有其他元素。Cn=(2n)!/((n+1)!*n!);我使用了这个公式我在每个节点上都有值,总共有20个节点,值为12的节点是根,值为7的节点是值为12的节点的左子树的根。挑剔:完整的二叉树在这里并不完全正确;我们对一般的二叉树感兴趣,因此可能需要解释原因(例如)对于6节点树的数量,C_6是合适的。(相比之下,具有6个叶节点的完整二叉树的数量是C_5,这不是您想要的,并且具有6个总节点的完整二叉树的数量是零,因为任何完整二叉树的节点数都是奇数。)@MarkDickinson很好。然而,“完整二叉树”在这里,我觉得这是从维基百科中这个加泰罗尼亚数字应用程序的描述中借用的语言。我们忽略了叶子,只计算节点(顶点),正是因为在“完全二叉树”中,每个顶点(节点)有“两个子节点或没有子节点”但在我们的例子中,树不是满的。例如,有4个节点的树变体有5片叶子,这就是为什么C_4适合于我们的“4节点”子树。是的,没错。我不怀疑C_6*C_4*C_8是正确的。我建议通过包含一些额外的解释来改进答案。我们确实需要一些“具有n
节点的完整二叉树”,但在这种情况下,n
的相关值是13、9和17,似乎值得解释这些值的来源。或者,可能更清楚地改为“具有n个叶节点的完整二叉树”“为了与维基百科兼容,然后解释为什么我们要使用n=7
,n=5
和n=9
,而不是n=6
,n=4
和n=8
,这是您当前的答案暗示的。@Mar