我试图为这个算法写一个递归关系。但是我对" root"变量。任何人都可以帮我或建议一个更好的递归算法来计算n个节点可能的二叉树数量?
Algorithm countTrees(n) {
if(n<=1) then return 1
else {
sum = 0
for root=1 to root<= n do {
left = countTrees(root-1)
right = countTrees(n-root)
sum = sum+(left*right)
}
return sum
}
}
到目前为止我已写过这篇文章,但我不知道如何处理根来解决这个问题。
T(n)= n [T(root-1)+ T(n-root)]
答案 0 :(得分:2)
您的代码已经是二叉树数量的递归关系,只是表示为算法。我猜你被困了,因为你对一个循环进行了求和。这是标准的数学符号 - 循环值从1..n变为0..n-1更加标准:
C(0) = C(1) = 1
C(n) = sum(C(i) * C(n-i-1) for i = 0...n-1)
手写(或使用LaTeX)你会使用求和符号而不是sum
,但它在逻辑上是相同的。
这是Catalan numbers的递归关系(虽然通常不会明确列出C(1)
个案例),并且链接的维基百科页面也包含递归关系的封闭形式解决方案和证明它的正确性。