unique_binary_search_trees
问题描述: 给定一个数n,问可以构成多少个结构上唯一的二叉树。
举例,给定n=3,一共有5个唯一的二叉树如下:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
input: 节点数目n
output: 二叉树个数
解题思路
使用动态规划+排列组合可以解决
当 n=0 时,空树的个数为1,记为num[0]=1;
当 n=1 时,节点为1,二叉树的个数为1,记为num[1]=1;
当 n=2 时,节点为1、2,二叉树的个数为num[2]=num[0]*num[1] + num[1]*num[0]=2:
- 以节点1为根节点,左子树节点个数为0,因此左子树个数为num[0],右子树节点个数为1,因此右子树个数为num[1],总的二叉树个数为num[0]*num[1](左右子树组合个数)。
- 以节点2为根节点,左子树节点个数为1,右子树节点个数为0,同理可求得总的二叉树节点个数为num[1]*num[2]。
当 n=3 时,二叉树个数为num[3]=num[0]*num[2]+num[1]*num[1]+num[2]*num[0]=5;
当 n为其他情况时以此类推。
java程序
public int numTrees(int n) {
int result = 0;
if(n < 0){
return -1;
}
if(n == 0 || n == 1){
return 1;
}else{
for(int i = 0; i < n; i++){
result += numTrees(i) * numTrees(n-1-i);
}
return result;
}
}
总结
其实这道题本身不难,就是要能够想到这种递归求解,排列组合的方式,另外这种1, 1, 2, 5, 14, 42,…数字的排列顺序称为卡特兰数,本题披着二叉树的外衣,根本上对卡特兰数的递归求解的运算!