木又同学2020年第49篇解题报告
leetcode第96题:不同的二叉搜索树
https://leetcode-cn.com/problems/unique-binary-search-trees
【题目】
给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
示例:
输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
【思路】
这是一道动态规划题目。
对于二叉搜索树,每个节点的左右子树都是二叉搜索树。
使用dp[i]表示二叉搜索树个数,那么 dp[i] = sum(dp[j] * dp[k]),其中j+k+1为i,j、k分别为遍历时左子树、右子树的节点个数。
【代码】
python版本
class Solution(object):
def numTrees(self, n):
"""
:type n: int
:rtype: int
"""
if n < 3:
return n
dp = [0] * (n + 1)
dp[1], dp[2] = 1, 2
for i in range(3, n + 1):
# dp[i] = sum(dp[j] * dp[k])
# j, k 为当前下标前的元素个数,当前下标后的元素个数
for j in range(i):
add_one = 1 if j == 0 else dp[j]
add_two = 1 if j == i - 1 else dp[i - j - 1]
dp[i] += add_one * add_two
return dp[-1]