[leetcode] 96. Unique Binary Search Trees

给定整数n,求所有可能的、存储1到n值的不同二叉搜索树的数量。例如,输入3,输出5,因为有5种不同的结构。分析中提到,可以通过递归计算以每个节点为根的树数量,结合笛卡尔乘积求解。代码部分展示了具体的实现逻辑。
摘要由CSDN通过智能技术生成

96. Unique Binary Search Trees

Description

Given n, how many structurally unique BST’s (binary search trees) that store values 1 … n?

Example:
Input: 3
Output: 5
Explanation:
Given n = 3, there are a total of 5 unique BST’s:

1 3 3 2 1
\ / / / \
3 2 1 1 3 2
/ / \
2 1 2 3

Analysis

依次计算以每个结点作为根节点的树的数量。由于二叉搜索树的特征为左子树所有节点都比根节点小,右子树所有节点都比根节点大,其子树也遵循此规则。因此如果确定了根节点为i,可知其左子树的根节点可有(i-1)种情况(有i-1个节点值小于i),其右子树的根节点可有(n-i)种情况(有n-i个节点值大于i),进而将左右子树的数量进行笛卡尔乘积,也就是说,如果左子树有m种情况,右子树有n种情况,则其排列组合共有m*n种情况。
而长度为n的树,其根节点有n种情况(0,1,…,n-1),设其为G(n)。设长度为n,且根节点为i的树,有F(i,n)种情况。因此,G(n)=F(0,n)+F(1,n)+F(2,n)+…+F(n-1,n) ①。

由第一段所说,可知根节点为i的树,其unique BST的数目为其左子树(长度为i-1)数目与右子树(长度n-i)数目的乘积。即*F(i,n)=G(i-1)G(n-i) ②。

另外,当节点总数为0时,为空树,此时G(0)=1;当节点总数为1时,只有一个节点,此时G(1)=1。

再结合式①和式②,可得:G(n) = G(0) * G(n-1) + G(1) * G(n-2) + … + G(n-1) * G(0) ③。

由式③可知,G(n)的计算是根据G(0), G(1), …, G(n-1)得到的。因此我们要从n小到n大计算G(n)。

Code

class Solution {
public:
    int numTrees(int n) {
        int G[n+1] = {0};
        G[0] = G[1] = 1;
        
        for(int i=2; i<=n; i++){
            for(int j=1; j<=i; j++){
                G[i] += G[j-1]*G[i-j];
            }
        }
        
        return G[n];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值