LeetCode 0096. Unique Binary Search Trees

问题简析

给定整数n,有多少个不同的储存1-n的二叉搜索树?
二叉搜索树(BST)要求左子树结点都比当前结点小,右子树结点都比当前结点大。

思路:动态规划。
设f(n)为有n个数字时可以构建多少种不同的树,则起始状态为

f(0)=1, f(1)=1, f(2)=2

考虑二叉搜索树的特点,可以发现,对于数列

123,……,n

从中取任意一个,它左边的数都是左子树的结点,右边的数都是右子树的结点。

例如对于数列1,2,3:
如果以1作为根结点,左子树为空,共有f(0)种情况。右子树包含2,3,有f(2)种情况。那么对于以1作为根节点的情形,一共是f(2)*f(0)种。

以此类推,可以得到以2作为根结点的情形,有f(1)*f(1)种;
以3作为根结点的情形,有f(2)*f(0)种。

综上,对于数列1,2,3有:

f(3) = f(0)*f(2) + f(1)*f(1) + f(2)*f(0);

同理:

f(4) = f(0)*f(3) + f(1)*f(2) + f(2)*f(1) + f(3)*f(0)
f(5) = f(0)*f(4) + f(1)*f(3) + f(2)*f(2) + f(3)*f(1) + f(4)*f(0)

可以发现规律:

f(n) = f(0)*f(n-1) + f(1)*f(n-2) + ... + f(n-2)*f(1) + f(n-1)*f(0)

题解

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值