自学内容网 自学内容网

【代码随想录】刷题记录(104)-不同的二叉搜索树

题目描述:

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

 

示例 1:

 

6d20955c0f400c926a6d7fc7a70ca500.jpeg

输入:n = 3
输出:5

示例 2:

输入:n = 1
输出:1

 

提示:

  • 1 <= n <= 19

 

我的作答:

思路是dp数组的每个元素i表示,i个不同元素组成的二叉搜索树数量;以dp[3]为例:

有dp[0]*dp[3],dp[1]*dp[2],dp[2]*dp[1],dp[3]*dp[0]四种情况,*左边为左子树,右边为右子树;因此可以得到递归公式dp[i] += dp[j-1]*dp[i-j]两层for循环,至于为什么是j-1,因为j-1+i-j=i-1,而dp[i]=dp[i]+dp[i-1],完成递归

初始化,因为一切都从dp[0]开始,所以dp[0]不能为0,设置为1,空结点也可以是树;

class Solution(object):
    def numTrees(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n==0: return 1
        dp = [0]*(n+1)
        dp[0] = 1 #初始化
        for i in range(1, n+1): #从1到n
            for j in range(1, i+1): #从1到i
                dp[i] += dp[j-1]*dp[i-j]
        return dp[n]

c3a7f535c5584b1f9cfe281f2412d0c4.png

 

参考:

差不多

 


原文地址:https://blog.csdn.net/Aerochacha/article/details/145183680

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!