使用这里介绍的方法:http://cslibrary.stanford.edu/110/BinaryTrees.html#java
12. countTrees() 解决方案 (Java) /** 对于键值1...numKeys,有多少个结构独特的二叉搜索树可以存储这些键?
策略:考虑每个值都可能是根。 递归地查找左子树和右子树的大小。 */ public static int countTrees(int numKeys) { if (numKeys <=1) { return(1); } else { // 根节点将有一个值,左右两侧的剩余部分将形成自己的子树。 // 迭代所有可能成为根的值... int sum = 0; int left, right, root;
for (root=1; root<=numKeys; root++) { left = countTrees(root-1); right = countTrees(numKeys - root);
// 具有此根的可能树的数量 == left*right sum += left*right; }
return(sum); } }
我感觉它可能是n(n-1)(n-2)...1,即n!
如果使用记忆化技术,复杂度是O(n)吗?