给定一组整数,找出可以构造多少个唯一的二叉搜索树?
根据我的说法,答案取决于整数集的大小..如果集合整数的大小是n ..那么“n”可以用它来制作唯一的二进制搜索树。
我不确定答案..我是对的吗?
答案 0 :(得分:2)
这可以通过使用动态编程来解决。
numTrees(i+1)=append the last node to the rightmost leaf of bst(i)[numTrees(i)] +
append the last node as the root of bst(i)[numTrees(i)] +
insert the last node as non-leaf node sum(k=1...i)(bst(k-1)*bst(i-k)
所以它是o(n ^ 2)解决方案。
public int numTrees(int n) {
if(n == 0 || n == 1 || n == 2)
return n;
int bst[] = new int[n+1];
bst[0] = 1;
bst[1] = 1;
bst[2] = 2;
for (int i=3; i<=n; i++) {
for (int j=1; j<i-1; j++) {
bst[i] += bst[j]*bst[i-1-j];
}
bst[i] += 2*bst[i-1];
}
return bst[n];
}
答案 1 :(得分:1)
数字是C_n,其中C_n是第n Catalan Number。可以通过选择n个节点中的任何一个作为根来递归地定义该值,然后采用所有可能的方式来组织根的左右子树,从而导致以下递归关系:
C_n = sum_ {i = 0} ^ {n - 1} C_i * C_ {n - 1 - i},
其中C_0 = 1。