​96. 不同的二叉搜索树​

难度中等

给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?

class Solution:
def numTrees(self, n: int) -> int:
if n == 0 or n == 1:
return n

dp = [0] * (n + 1)
dp[0] = 1
dp[1] = 1

for i in range(2, n + 1): # 当一共有i个节点时
for j in range(i): # 当第j个节点是根节点时
dp[i] += dp[j] * dp[i - 1 - j]

return dp[i]

95  96 不同的二叉搜索树_二叉搜索树

延伸

​95. 不同的二叉搜索树 II​

难度中等

给定一个整数 n,生成所有由 1 ... n 为节点所组成的 二叉搜索树 

class Solution:
def generateTrees(self, n: int) -> List[TreeNode]:

def generate_trees(start, end):
if start > end:
return [None,]

all_trees = []
for i in range(start, end + 1):
# 左树的所有结构
left_trees = generate_trees(start, i - 1)

# 右树的所有结构
right_trees = generate_trees(i + 1, end)

# 左树和右树进行笛卡尔积拼接
for l in left_trees:
for r in right_trees:
current_tree = TreeNode(i)
current_tree.left = l
current_tree.right = r
all_trees.append(current_tree)
return all_trees

# 1, n都是根节点取到的索引
return generate_trees(1, n) if n else []

效果并不是很好

95  96 不同的二叉搜索树_二叉搜索树_02