classSolution(object):defnumTrees(self, n):"""
:type n: int
:rtype: int
"""if n<=1:return1
dp=[0]*(n+1)
dp[0]=1
dp[1]=1
dp[2]=2for i inrange(3,n+1):for k inrange(i):
dp[i]+=dp[k]*dp[i-k-1]return dp[n]
classSolution:defgenerateTrees(self, n):"""
:type n: int
:rtype: List[TreeNode]
"""ifnot n:return[]return self.DFS(1,n)defDFS(self,left,right):if left>right:return[None]
res=[]for i inrange(left,right+1):
leftNode=self.DFS(left,i-1)
rightNode=self.DFS(i+1,right)for l in leftNode:for r in rightNode:
root=TreeNode(i)
root.left=l
root.right=r
res.append(root)return res