题目描述:
题解:
关键:在输入的n个节点中,可以选择第i个作为根节点,前1-i-1个节点作为左子树,i+1-n个节点作为右子树。所以当选择i作为根节点时,左子树有i-1个节点,右子树有n-i个节点。用G(i)表示i个节点可以构成的BST数量。f(i)表示以i为根结点的子树数量,f(i)=G(i-1)*G(n-1)
G(n)=f(1)+f(2)+...+f(n)=G(0)*G(n-1)+G(1)*G(n-2)+...+G(n-1)*G(0)
class Solution(object): def numTrees(self, n): dp = [0]*n+1 dp[0] = 1 dp[1] = 1 for i in range(2,n+1): for j in range(1,i+1): dp[i] = dp[i]+dp[j-1]*dp[i-j] return dp[n]