leetcode-96 不同的二叉搜索树
leetcode-96 不同的二叉搜索树
解题思路
对于从1-n所有的二叉搜索树,共有n种(每种的顶点相同)
设Fn为从1-i的以n为根的二叉搜索树的个数
dp[n]为1-i的所有的二叉搜索树的个数
对于以i为根的二叉搜索树,它的左子树共有Fn[i-1]种,右子树共有Fn[n-i-1]种,则以i为根的二叉搜索树Fn[n]=Fn[i-1]*Fn[n-i-1]
使用动态规划求解:
- 初始化
dp[0]=1 代表空子树只有一种形状
dp[1]=1 代表只有一个结点的树只有一种形状 - 状态转移方程
\(dp[i]=\sum dp[j]*dp[i-j-1]\)
代码
class Solution:
def numTrees(self, n: int) -> int:
dp=[0]*(n+1)
dp[0]=1
dp[1]=1
for i in range(2,n+1):
for j in range(i):
dp[i]+=(dp[j]*dp[i-j-1])
return dp[-1]