动态规划
选定一个root,其可形成的可能的二叉搜索树的数量为dp(root)
则 dp(root) = 1*dp(root.left)*dp(root.right)
其中1代表选定了root后只有一种情况
而因为所有的数都可能成为root
所以 我们需要遍历数组,让所有数都当一次root
选定i为root后,[1,…,i-1]即为左子树的候选
[i+1,…,n]为右子树的候选
递归即可
class Solution:
def __init__(self):
self.ind = {}
def numTrees(self, n: int) -> int:
res = self.generate_2_layer(1,n)
return res if n != 0 else 0
def generate_2_layer(self,start,end):
if (start,end) in self.ind:
return self.ind[(start,end)]
res_list = []
for i in range(start,end + 1):
res = 1
left_tree = self.generate_2_layer(start,i-1) if i > start else 1
right_tree = self.generate_2_layer(i+1,end) if i < end else 1
res = res * left_tree
res = res * right_tree
res_list.append(res)
suma = sum(res_list)
self.ind[(start,end)] = suma
return suma