题目:
Given n, how many structurally unique BST's (binary search trees) that store values 1...n?
For example,
Given n = 3, there are a total of 5 unique BST's.
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
思路:
看到题目,就感觉应该会有递推公式。于是,画出n=1,2,3的情况进行分析。
发现,n=2到n=3,其实就是寻找摆放3的位置。
3种情况:
1. 根为3
把3直接接在所有2的情况的上面,作为根,数量:2
2. 最右为3
把3直接接在所有2的情况的最右边,数量:2
3. 插入3
再分析可以发现,3只插入到从跟节点开始的最右路径上。
1 2
\ /
2 1
只有左边的符合,数量:1
所以3的种类是5.
推广到n=4的情况:
1. 根为4 f(n-1)=5
2. 最右为4 f(n-1)=5
3. 插入4 14种。
1234 124 134 14(*2)
234 24
34(*2)
但是困难就在这里了,如何计算“插入4”这种情况的总数?.......
卡住了,换思路。
==============================================
题解:
动态规划DP
n=1 ans = 1
n=2 ans = 2
n>=3 考虑根节点的可能情况,为n种,对于每一种根,分别考虑左右子树可能的情况数,相乘等到该根节点的情况总数,将n个根节点情况总数相加即可。
class Solution:
# @return an integer
def numTrees(self, n):
ans = [1,1,2,5]
if n > 3:
for i in range(4,n+1):
ans.append(0);
for j in range(0,i):
ans[i] += ans[j]*ans[i-j-1]
return ans[n]
AC.