题目:n个不同的数的排序二叉树个数
解法:
我们假设我们需要的函数为F(x), 则F(0) = F(1) = 1,F(2) = 2, F(3) = 5【可以自行检验】
① 当1为根节点的时候:那么剩下的元素只能全部在右边:那么右子树唯一的个数为当n为三的时候的个数:F(3)
② 当2为根节点的时候:那么1只能在左边,剩下的3和4只能在右边,左边只有一种组成方式,右边有F(2)种组成方式。
③ 当3为根节点的时候,右边只有4,左边有1和2,跟2为根节点的情况一样。
④ 当4为根节点的时候,剩下的元素只能全部在左边,那么有F(3)种组成方式。
所以总的组成方式就是上面4种情况的总和。
public static int numTrees(int n){
int[] buff = new int[n+1];
buff[0] = 1;
buff[1] = 1;
return numTrees(n, buff);
}
private static int numTrees(int n, int[] buff){
if(buff[n]!=0)
return buff[n];
int temp = 0;
for (int i = 0; i < n; i++) {
temp += numTrees(i, buff) * numTrees(n-1-i, buff);
}
buff[n] = temp;
return temp;
}
网友评论