95 96 不同的二叉搜索树
原创
©著作权归作者所有:来自51CTO博客作者wx5b46e9a3dd067的原创作品,请联系作者获取转载授权,否则将追究法律责任
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. 不同的二叉搜索树 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 []
效果并不是很好