给出BST 的中序排列,输出所有可能结构的总数:
思路
最简单的思路,和code95类似,分别算出left 和 right ,代码如下:
class Solution(object):
def beTravl(self,start,end):
if start > end:
return 1
if start == end:
return 1
root_len = 0
for root_val in range(start,end+1):
left = Solution.beTravl(self,start,root_val-1)
right = Solution.beTravl(self,root_val+1,end)
# print(root_val,left,right,root_len)
root_len = root_len+left*right
return root_len
def numTrees(self, n):
"""
:type n: int
:rtype: int
"""
return Solution.beTravl(self,1,n)
但是,这种结果由于时间复杂度关系,并不能很好的AC完所有数据
思路2 动态规划
思路:
- 和思路1类似,当以x 为根节点时,一共有 d [ x − 1 ] ∗ d [ n − ( x + 1 ) ] d[x-1]*d[n-(x+1)] d[x−1]∗d[n−(x+1)] 中结构。
- d [ n ] d[n] d[n] 可以通过求 以 1~n-1 为根节点的结构数之和
- 关键公式如下:
d [ x ] = d [ x ] + d [ i ] ∗ d [ x − i − 1 ] d[x] = d[x]+d[i]* d[x-i-1] d[x]=d[x]+d[i]∗d[x−i−1]
class Solution(object):
def numTrees(self, n):
"""
:type n: int
:rtype: int
"""
d = [0 for _ in range(n+1)]
d[0]=1
d[1]=1
for x in range(2,n+1):
# 以 1~x 中的任意任意点为起点
for i in range(x):
d[x] = d[x]+d[i]* d[x-i-1]
return d[n]```