例如对于 N=3,我们可以通过将它们全部列出来轻松找到,但是当被要求提供任意 N 值时,我遇到了问题。
4 回答
如果您正在查看二叉树,那么正如 mcdowella 所说,选择(2n,n)/(n+1)(加泰罗尼亚数)就是答案。
如果您正在查看任意树,那么它可能是 n。n^(n-2) = n^(n-1),但我不完全确定。Prufer 的算法告诉我们有 n^(n-2) 个标记的树,并且任何节点都可以成为根,因此我们得到了 n^(n-1) 的数字。
这在 Knuth Vol 1(计算机编程的艺术:基础算法)第 2.3.4.4 节中有所介绍://oeis.org/A000108
你可以使用动态编程来实现它:
让我们来看看fix element i as the root
树吧。现在我们需要知道how many different trees
我们可以用the first (i-1) elements and the rest (n-i-1) elements
.
因此,我们对这两个子数组遵循相同的过程(i-1)
并(n-i-1)
获得以下递归:
公式:
乳胶:
树[n]&space;=&space;\sum_{i&space;=&space;2}^{i&space;=&space;n-1}&space;Trees[i-1]*Trees[ni-1]
二叉树 (2n,n)/(n+1) (加泰罗尼亚语数) 作为答案 如果标记为树而不是 n^(n-2) 棵树。