96. Unique Binary Search Trees

題目如下:


首先二叉搜索樹(shù)與二叉樹(shù)的區(qū)別在于BST一定是二叉樹(shù),并且結(jié)點(diǎn)信息是關(guān)鍵碼(可能還帶有記錄的索引),并且BST中關(guān)鍵碼無(wú)重復(fù),左子樹(shù)如果存在,其所有的關(guān)鍵碼一定小于根,右子樹(shù)如果存在,其所有關(guān)鍵碼一定大于根,左右子樹(shù)自然也是BST,因此有特性中序遍歷序列單調(diào)遞增

這道題應(yīng)該是做題兩個(gè)星期以后解題最快的一道了,5分鐘提交。這道題目咋一看沒(méi)什么思路,也沒(méi)什么狀態(tài),動(dòng)作之類的,但是畫(huà)一畫(huà)圖馬上就知道該怎么做了,n個(gè)數(shù),分析它的子樹(shù),假設(shè)左邊有i個(gè)數(shù),(這i個(gè)數(shù)都比他?。┠敲从疫吘陀衝-1-i個(gè)數(shù)(同理都比它大),那么很明顯,變成了兩個(gè)子問(wèn)題,dp[n]=dp[i]*dp[n-1-i],i=0到n-1求和,我們不斷分解到最后,發(fā)現(xiàn)dp[0]=dp[1]=1,dp[2]已經(jīng)可以由dp[0]和dp[1]得出,為了減少計(jì)算量,用一個(gè)數(shù)組記錄之前計(jì)算得到的dp,避免重復(fù)計(jì)算,此題得解。

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)

以上是自己的解法,看了一下討論,大部分都是這個(gè)想法,不過(guò)看到了一個(gè)遞歸的解法,的確,這個(gè)題,與斐波那契有相似之處,都可以用遞歸來(lái)求解

題解如下:

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容