leetcode96.不同的二叉搜索树 Python

题目:

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

示例:

leetcode96.不同的二叉搜索树 Python_第1张图片

输入:n = 3
输出:5

思路:

二叉搜索树也叫二叉查找树或者二叉排序树整个二叉树的所有子树都是左子树的节点值小于根节点的值小于右子树的值。

当一共有n个节点,我们以第i个节点为根节点,那1到i-1的节点会作为左子树,i+1到n的节点会构成右子树,由于当分别以1到n的节点为根节点时,左右子树的构成中根节点的选择也会不一样,所以不会有重复的情况出现。

使用动态规划,定义一个长度为n的动态数组,dp[n]就是长度为n的序列可构成的搜索树的数量,它就等于以i为根,长度为n的序列可构成的搜索树数量之和,这有n种情况,每一种情况的值又与动态数组有关,综合得到递归表达式。当序列长度为0或者1时,就只有一种情况。
dp[0] = 1
dp[1] = 1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
结合1和2得到3。

class Solution(object):
    def numTrees(self, n):
        """
        :type n: int
        :rtype: int
        """
        dp = [0] * (n+1)
        dp[0] = 1
        dp[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[n]

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