Problem
Given an integer n, return all the structurally unique BST’s (binary search trees), which has exactly n nodes of unique values from 1 to n. Return the answer in any order.
Algorithm
Dynamic Programming (DP).
States: dp(i, j) is the list of all the BST’s that can be constructed by the number from i to j.
Translation:
d
p
(
i
,
j
)
=
T
r
e
e
N
o
d
e
(
k
,
d
p
(
i
,
k
−
1
)
,
d
p
(
k
+
1
,
j
)
)
dp(i, j) = TreeNode(k, dp(i, k-1), dp(k+1, j))
dp(i,j)=TreeNode(k,dp(i,k−1),dp(k+1,j))
Code
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def generateTrees(self, n: int) -> List[TreeNode]:
dp = [[[] for i in range(n+1)] for j in range(n+2)]
for s in range(1, n+2):
dp[s][s-1] = [None]
for L in range(1, n+1):
for s in range(1, n-L+2):
e = s+L-1
for k in range(s, e+1):
for Lchild in dp[s][k-1]:
for Rchild in dp[k+1][e]:
dp[s][e].append(TreeNode(k, Lchild, Rchild))
return dp[1][n]