给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种?
样例
给出n = 3,有5种不同形态的二叉查找树:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
样例
给出n = 3,有5种不同形态的二叉查找树:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
import java.util.Scanner;
/**
* 给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种?
样例
给出n = 3,有5种不同形态的二叉查找树:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
* @author Dell
*
*/
public class Test163 {
public static int numTrees1(int n) //数字大了会溢出
{
long sum=1;
int k=2*n;
for(int i=1;i<=n;i++)
{
sum=sum*k;
k--;
}
System.out.println(sum);
int result=(int)(sum/fun(n+1));
return result;
}
public static long fun(int n)
{
if(n==0||n==1)
return 1;
else
{
return n*fun(n-1);
}
}
public static int numTrees(int n) //动态规划
{
int[] dp=new int[n+1];
dp[0]=dp[1]=1;
for(int i=2;i<=n;i++)
{
for(int j=1;j<=i;j++)
dp[i]+=dp[j-1]*dp[i-j];
}
return dp[n];
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
System.out.println(numTrees(n));
}
}