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]
使用动态规划求解:

  1. 初始化
    dp[0]=1 代表空子树只有一种形状
    dp[1]=1 代表只有一个结点的树只有一种形状
  2. 状态转移方程
    \(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]
posted @ 2021-10-16 10:32  流光之中  阅读(12)  评论(0编辑  收藏  举报