LeetCode-python 96.不同的二叉搜索树

题目链接
难度:中等       类型: 二叉树、动态规划、卡特兰数


给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?

示例

输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树

解题思路


dp[i]表示i个数能组成的二叉搜索树的种数,f[i]表示以i为根结点时的二叉搜索树的种树
dp[i] = f[1]+ f[2]+ f[3]+...+ f[n]
当 i 为根节点时,其左子树节点个数为 i-1个,右子树节点个数为 n-i,则有
f[i] = dp[i-1] * dp[n-i]
可以发现,dp[i]和序列的内容无关,只与序列的长度有关

综上,dp[n] = dp[0]dp[n-1] + dp[1]dp[n-2]+...+dp[n-1]*dp[0],即卡特兰数
递推公式:
dp[0] = 1
dp[n] = \frac{2(2n-1)/(n+2)}{n+2} dp[n-1]

代码实现

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

本文链接:https://www.jianshu.com/p/d86700f0fb78

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 描述:给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?示例: 输入: 3输出: 5解释:给...
    大数据Zone阅读 1,701评论 0 3
  • 树形动态规划,顾名思义就是树+DP,先分别回顾一下基本内容吧:动态规划:问题可以分解成若干相互联系的阶段,在每一个...
    Mr_chong阅读 1,643评论 0 2
  • 树的定义与基本术语   树型结构是一类重要的非线性数据结构,其中以树和二叉树最为常用,是以分支关系定义的层次结构。...
    java技术分享师阅读 1,261评论 0 1
  • 介绍 二叉树的结构 二叉树常考的原因有如下几点1、它可以结合链表、栈、队列和字符串等数据结构出题2、需要熟练掌握图...
    雨住多一横阅读 522评论 0 1
  • 天冷,用来循环暖气供水的阀坏了,原本就不暖和的屋子更冷了,全家人躲在厚棉衣里瑟瑟发抖。没有热水,连洗衣,刷碗都变得...
    Oo呢喃oO阅读 158评论 0 0

友情链接更多精彩内容