96_不同的二叉搜索树(中等)

题目

给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?

示例:

输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:

思路

  • 二叉搜索树以I为根,左边的小于i,右边的大于i,同时有N个数,则一共可以有N个根,即
f(n) = t(1) + t(2) + t(3) + t(4) + ..+t(i)...+ t(n)
  • 以i为根时,左边有i-1个数,右边有N-i个数,则,他的右边有f(i-1)个二叉搜索树数,右边有f(N-i)个二叉搜索树数,左右二叉树排序互不相关,所以每改变左右任意一个数,则总的二叉树结构就改变一次。所以
t(i) = f(i-1) * f(n-i)
 1、当n = 1 时
	f(1) = t(1) = 1 
 2、当n = 2时
	f(2) = t(1)  + t(2) = 2
	t(1) = f(0) * f(1) = 1
	t(2) = f(1) * f(0) =1
 3、当n = 3时
 	f(3) = t(1) + t(2) + t(3) = 5
 	t(1) = f(0) * f(2) = 2
 	t(2) = f(1) * f(1) = 1
 	t(3) = f(2) * (0)  = 2
以此类推
  • 所以总的公式为:
f(n) = f(0) * f(n-1) + f(1) * f(n-2) + .... + f(i-1) * f(n-i) ...+ f(n-1) * f(0)

代码:

class Unique_Binary_Search_Trees_96 {
    public int numTrees(int n) {
        if (n<=1){
            return 1;
        }
        int[] dp = new int[n + 1];
        dp[0] = 1;
        dp[1] = 1;

        //dp[i] i个节点有多少个二叉搜索树
        for (int i = 2; i <= n ;i++){
            //J表示以J为根节点,左右节点数为 j-1、i-j,根节点取1~i
            for (int j = 1 ; j <= i; j++){
                dp[i] += dp[j-1] * dp[i-j];
            }
        }

        return dp[n];
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值