美文网首页动态规划
96. Unique Binary Search Trees

96. Unique Binary Search Trees

作者: _昊 | 来源:发表于2018-12-10 19:28 被阅读16次

题目如下:

首先二叉搜索树与二叉树的区别在于BST一定是二叉树,并且结点信息是关键码(可能还带有记录的索引),并且BST中关键码无重复,左子树如果存在,其所有的关键码一定小于根,右子树如果存在,其所有关键码一定大于根,左右子树自然也是BST,因此有特性中序遍历序列单调递增

这道题应该是做题两个星期以后解题最快的一道了,5分钟提交。这道题目咋一看没什么思路,也没什么状态,动作之类的,但是画一画图马上就知道该怎么做了,n个数,分析它的子树,假设左边有i个数,(这i个数都比他小)那么右边就有n-1-i个数(同理都比它大),那么很明显,变成了两个子问题,dp[n]=dp[i]*dp[n-1-i],i=0到n-1求和,我们不断分解到最后,发现dp[0]=dp[1]=1,dp[2]已经可以由dp[0]和dp[1]得出,为了减少计算量,用一个数组记录之前计算得到的dp,避免重复计算,此题得解。

class Solution:

    def numTrees(self, n):

        """

        :type n: int

        :rtype: int

        """

        if n==0 or n==1:

            return 1

        dp=[0]*(n+1)

        dp[0]=1

        dp[1]=1

        for i in range(2,n+1):

            k=0

            for j in range (i):

                k=dp[j]*dp[i-1-j]+k

            dp[i]=k

        return dp[n]

solution=Solution

k=solution.numTrees(solution,2)

print(k)

以上是自己的解法,看了一下讨论,大部分都是这个想法,不过看到了一个递归的解法,的确,这个题,与斐波那契有相似之处,都可以用递归来求解

题解如下:

class Solution:

    def __init__(self):

        self.dic = {}

    def numTrees(self, n):

        if n <= 1:

            return 1

        elif n in self.dic:

            return self.dic[n]

        else:

            out=0

            for i in range(0, n):

                out += ( self.numTrees(i) * self.numTrees(n-1-i) )

            self.dic[n] = out

            return out

相关文章

网友评论

    本文标题:96. Unique Binary Search Trees

    本文链接:https://www.haomeiwen.com/subject/uvmdhqtx.html