leetcode不同的二叉搜索树python

题目
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

思路及代码
这题也是刷了好几遍,今天再看,一点思路都没有。只能说理解的不到位。

二叉搜索树

首先回顾一下二叉搜索树。什么是二叉搜索树?空树或者满足做节点值小于根节点值,右节点值大于根节点值,左右子树也均是二叉搜索树。

动规五要素

然后回顾一下动态规划五要素。第一明确dp数组和下标的含义,第二初始化,第三递推公式,第四遍历顺序,第五推导实例。

本题思路

再回到这题中。当n=1的时候,就一种情况;当n=2的时候,有两种情况。当n=3的时候,二叉树的数目 = 1为根的二叉树的个数 + 2为根的二叉树的个数 + 3为根的二叉树的个数。

1为根的二叉搜索树的个数= 左子树结点数为0的二叉搜索树 * 右子树节点数为2的二叉搜索树

2为根的二叉搜索树的个数 = 左子树节点数为1的二叉搜索树 * 右子树节点数为1的二叉搜索树

3为根的二叉搜索树的个数= 左子树结点数为2的二叉搜索树 * 右子树节点数为1的二叉搜索树

因此dp[3] = dp[0]*dp[2] + dp[1]*dp[1] + dp[2]*dp[0]

dp数组及下标的含义:dp[i]表示的是1-i为结点组成二叉搜索树的个数。
初始化:dp数组里所有元素均为0,dp[0]= 1,dp[1]= 1
递推公式:dp[i] += dp[j-1]*dp[i-j]
遍历顺序:i从2~n,j从1到i
推导实例:n=3,上述已推导
dp[2] = dp[0]*dp[1] + dp[1]*dp[0] = 2
dp[3] = dp[0]*dp[2] + dp[1]*dp[1] + dp[2]*dp[0] =2+1+2 = 5

class Solution:
    def numTrees(self, n: int) -> int:
        dp = [0]*(n+1)
        dp[0], dp[1] = 1, 1
        for i in range(2, n+1):
            for j in range(1,i+1):
                dp[i] += dp[j-1] * dp[i-j]
        return dp[-1]

你可能感兴趣的:(leetcode,算法,动态规划)