95. Unique Binary Search Trees II
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def generateTr_DFS(self, val, l, r):
print(val, l, r)
if len(self.mem[val][l][r]):
return self.mem[val][l][r]
if l == r:
leafnode = TreeNode(val)
self.mem[val][l][r].append(leafnode)
return self.mem[val][l][r]
ret = []
if val == l:
for rval in range(val+1, r+1):
for rnode in self.generateTr_DFS(rval, val+1, r):
ret.append(TreeNode(val, None, rnode))
self.mem[val][l][r] = ret
return ret
if val == r:
for lval in range(l, val):
for lnode in self.generateTr_DFS(lval, l, val-1):
ret.append(TreeNode(val, lnode, None))
self.mem[val][l][r] = ret
return ret
for lval in range(l, val):
lnodes = self.generateTr_DFS(lval, l, val-1)
for rval in range(val+1, r+1):
rnodes = self.generateTr_DFS(rval, val+1, r)
for lnode in lnodes:
for rnode in rnodes:
ret.append(TreeNode(val, lnode, rnode))
self.mem[val][l][r] = ret
return ret
def generateTrees(self, n: int):
self.mem = []
for i in range(n+1):
self.mem.append([])
for j in range(n+1):
self.mem[i].append([])
for k in range(n+1):
self.mem[i][j].append([])
ans = []
for num in range(1, n+1):
for root in self.generateTr_DFS(num, 1, n):
ans.append(root)
return ans
# sol = Solution()