唯一BST(96)

题目


1~n共n个数能组成几个不同的二叉查找树BST
例如
n=3时,可以组成以下五个BST

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3

分析


想明白了其实特别简单。假如结果为f(n)。每一个节点i都可以做根,然后把剩余的节点分成两部分[1, i-1] 和 [i+1, n],分别构成f(i-1)个与f(n-i)个左右子树,每一种左子树都与一种右子树搭配构成一个完整的树,共有f(i-1)*f(n-i)种组合。把每一个节点i做树根的结果加起来,即为所求。

代码


class Solution(object):
    def numTrees(self, n):
        """
        :type n: int
        :rtype: int
        """
        nums = [1] + [0] * n
        for i in range(1, n+1):
            for r in range(i):
                nums[i] += nums[r] * nums[i-r-1]
        return nums[n]
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 课程介绍 先修课:概率统计,程序设计实习,集合论与图论 后续课:算法分析与设计,编译原理,操作系统,数据库概论,人...
    ShellyWhen阅读 2,368评论 0 3
  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 4,501评论 1 31
  • 关键20小时,快速学会任何技能 还没看过这本《关键20小时,快速学会任何技能》,我之前在掌阅上看过这本书的名字,但...
    小秦哥哥阅读 203评论 3 2
  • 以下程序用 MFC做,都是可以用c语言+win api做,不过是我以前学C++就用C++做而已。 自动关机。有用C...
    YongHao阅读 934评论 2 13
  • 首先先了解几个知识点: SDK版本低于7.1.1使用WindowManager.LayoutParams.TYPE...
    handsomeslow阅读 7,992评论 2 4