给你一个整数
n
,求恰由n
个节点组成且节点值从1
到n
互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。链接:https://leetcode-cn.com/problems/unique-binary-search-trees/
定义: d p [ i ] dp[i] dp[i]表示从节点为 i i i个的互不相同的二叉搜索树的种数
边界条件: d p [ 0 ] = 1 , d p [ 1 ] = 1 , d p [ 2 ] = 2 dp[0]=1,dp[1]=1,dp[2]=2 dp[0]=1,dp[1]=1,dp[2]=2,没有节点,空集唯一;1个节点,一种;2个节点,两种
状态转移方程: d p [ i ] = ∑ j = 0 i − 1 d p [ j ] ∗ d p [ i − j − 1 ] dp[i] = \sum\limits_{j=0}^{i-1} dp[j]* dp[i-j-1] dp[i]=j=0∑i−1dp[j]∗dp[i−j−1]
说明:
当没有节点,空集唯一;
1个节点,一种;
2个节点,两种,分别是,给定一个节点,左子树1个节点,右子树0个节点,以及给定一个节点,左子树0个节点,右子树1个节点
3个节点,5种,分别是,给定一个节点,①左子树2个节点,右子树0个节点;②左子树1个节点,右子树1个节点;③左子树0个节点,右子树2个节点。对于情况1和情况3,分别可以表示为 d p [ 2 ] ∗ d p [ 0 ] dp[2]*dp[0] dp[2]∗dp[0]和 d p [ 0 ] ∗ d p [ 2 ] dp[0]*dp[2] dp[0]∗dp[2]的情况,其他同理,即得到对应的状态转移方程。
class Solution:
def numTrees(self, n: int) -> int:
# 动态规划方法
#dp[i] = Σdp[k]*dp[i-k-1]
dp = [0]*(n+1)
dp[0] = 1 # 0个元素
dp[1] = 1 # 1个元素
if n<=1: return dp[n]
for i in range(2,n+1):
for j in range(i):
dp[i] += dp[i-j-1]*dp[j]
return dp[n]
该方法复杂度为O(n^2),可以利用数学方法,得到通项公式(卡特兰数),降低复杂度