给定 n,有多少结构上唯一的BST(二叉搜索树)存储值1 ... n?
例如, 给定 n = 3,总共有 5 个独特的 BST。
解题思路:
- 既然是二叉搜索树,我们呢就要考虑到二叉搜索树的特性;
- 从中序遍历的角度来讲,如果选定了一个数为根节点,那么它的左子树中的节点肯定都比他小, 右子树中的节点都比它大。
- 所以采用递归的解题思路。
// 注意,由于对于 0,1 情况的限制,这里用迭代的思想来求解
public int numTrees(int n) {
if(n == 0) return 0;
int [] f = new int[n + 1];
f[0] = 1;
for(int i = 1; i <= n; i++){
// 对于 i 作为根节点来讲,唯一树的个数为:左子树的个数 * 右子树的个数
for(int j = 1; j <= i; j++){
// 当 i 为根节点,那么它的左子树有 1,2...i-1 种,右子树有 n - i 种
f[i] += f[j - 1] * f[i - j];
}
}
return f[n];
}