首先是遞歸的解法,
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def tree(self,left,right):
if right<left:
return [None]
root_list=[]
for i in range(left,right+1):
left_set=self.tree(left,i-1)
right_set=self.tree(i+1,right)
for l in left_set:
for r in right_set:
root=TreeNode(i)
root.left,root.right=l,r
root_list.append(root)
return root_list
def generateTrees(self, n: int) -> List[TreeNode]:
if n==0:
return []
return self.tree(1,n)
dp解法
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
from collections import defaultdict
class Solution:
def generateTrees(self, n: int) -> List[TreeNode]:
dp=defaultdict(list)
for i in range(1,n+1):
dp[(i,i)].append(TreeNode(i))
for k in range(2,n+1):
for i in range(1,n-k+2):
for j in range(i,i+k):
if j-1<i:
dp[(i,j-1)]=[None]
if i+k-1<j+1:
dp[(j+1,i+k-1)]=[None]
for l in dp[(i,j-1)]:
for r in dp[(j+1,i+k-1)]:
root=TreeNode(j)
root.left,root.right=l,r
dp[(i,i+k-1)].append(root)
return dp[(1,n)]