Unique Binary Search Trees

406 篇文章 0 订阅
406 篇文章 0 订阅

1,题目要求

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:
    在这里插入图片描述
    给定n,有多少结构上唯一的BST(二叉搜索树)存储值1 … n?

2,题目思路

对于这道题,所要求的是给定一个数字n,求出从1到n的所有数字所构成的二叉搜索树的种类。

这道题,我们利用动态规划的方法来做。

假设给定了n,则我们有序列1,2,3,…,n。为了构造这个BST。
如果我们用数字i作为当前的BST的根节点,那么:

  • 子序列1,2,…,i-1在左子树中;
  • 子序列i+1,i+2,…,n在右子树中。

于是,我们就可以递归的构建整棵树。

因此,我们有函数:

  • G(n):长度为n的BST的个数;
  • F(i, n), 1 <= i <= n:以节点i为根节点,且长度为n的BST的个数。

因此,我们只需要求出G(n)即可,而G(n):

  • G(n) = F(1, n) + F(2, n) + … + F(n, n).

同时,我们有:

  • G(0) = 1:空树
  • G(1) = 1:仅有一个根节点

而对于F(i, n)的含义,比如F(3, 7),说明根节点是3,因此左子树的子序列应该是[1,2],而右子书序列为[4,5,6,7]。
而左右子树:

  • 左子树的BST种类数为:G(2)
  • 右子树的BST种类数为:G(4)

因此,F(3,7) = G(2) * G(4)
之所以是所有种类,所以是左右种类乘积。

因此:

  • F(i, n) = G(i-1) * G(n - i)

总结起来:

  • G(n) = G(0) * G(n-1) + G(1) * G(n-2) + … + G(n-1) * G(0)

3,代码实现

static auto speedup = [](){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    return nullptr;
}();

class Solution {
public:
    int numTrees(int n) {
        vector<int> treeDP (n+1, 0);
        treeDP[0] = 1;
        treeDP[1] = 1;
        
        for(int i =2;i<=n;i++)
            for(int j = 1;j<=i;j++)
                treeDP[i] += treeDP[j-1]*treeDP[i-j];
        
        return treeDP[n];
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值