96. 不同的二叉搜索树
96. 不同的二叉搜索树
题意
给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
解题思路
对于n个结点,除去了跟结点,还剩余n-1个结点,因此左右子树的结点数分配方式如下:
假定G(n)表示由连续的n个数形成的二叉搜索树的个数,并且以i作为分界点,
那么左子树为G(i-1),右子树为G(n-i),那么公式则为:
可以发现这就是卡特兰数的应用,这种应用通常使用动态规划来解决;
实现
class Solution(object):
def numTrees(self, n):
"""
:type n: int
:rtype: int
"""
dp = [0] * (n+1)
dp[0] = dp[1] = 1
# 假定一共有n个数,并且以j作为分界线
for i in range(2, n+1):
for j in range(1, i+1):
dp[i] += dp[j-1] * dp[i-j]
return dp[n]
![](https://i.loli.net/2018/11/17/5beff4d639cbb.jpg)
关注公众号:数据结构与算法那些事儿,每天一篇数据结构与算法