leetcode--unique_binary_search_trees问题

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,…数字的排列顺序称为卡特兰数,本题披着二叉树的外衣,根本上对卡特兰数的递归求解的运算!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值