给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种?
给出n = 3,有5种不同形态的二叉查找树:
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \
2 1 2 3
/* 注意:二分查找树的定义是,左子树节点均小于root,右子树节点均大于root!不要想当然地将某个点作为root时,认为其他所有节点都能全部放在left/right中,除非这个点是 min 或者 max 的。 分析:本题其实关键是递推过程的分析,n个点中每个点都可以作为root, 当 i 作为root时,小于 i 的点都只能放在其左子树中, 大于 i 的点只能放在右子树中,此时只需求出左、右子树各有多少种,二者相乘即为以 i 作为root时BST的总数。 故考虑类似于动态规划的思想,让底层的计算结果能够被重复利用,故用一个数组存储中间计算结果(即 1~n-1 对应的BST数目),这样只需双层循环即可, */ public class Solution { public int numTrees(int n) { // write your code here if(n<0) return 0; if(n==0) return 1; int nums[] = new int[n+1]; nums[0] = 1; for(int i=1;i<=n;i++){ if(i<3){ nums[i] = i; }else{ for(int j=1;j<=i;j++){ nums[i] =nums[i]+nums[j-1]*nums[i-j]; } } } return nums[n]; } }