给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
首先明确一下二叉搜索树:根节点的值大于其左子树中任意一个节点的值,小于其右节点中任意一节点的值,这一规则适用于二叉查找树中的每一个节点。
输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
看了大佬的动态规划思路,题目可以简化为一个动态规划问题,设T(n)为n个根节点的二叉树的个数,若1为根节点,则1的左子树为0,右子树的根节点个数T(n-1-0);2为根节点则,左子树为T(2-1),右子树为T(n-1-(2-1)); 起始值T(1) = 1,T(0) = 1。
归纳即为T(n) = T(n-1) * T(0) + T(n-2) * T(1) + … + T(1) * T(n-2) + T(0) * T(n-1)
class Solution:
def numTrees(self, n: int) -> int:
T = dict()
T[0], T[1], T[n] = 1, 1, 0
for j in range(1,n):
T[j] = self.numTrees(j)
for i in range(0,n):
T[n] += T[i] * T[n-i-1]
return T[n]
或者不用递归
class Solution:
def numTrees(self, n: int) -> int:
T = [0] * (n+1)
T[0], T[1] = 1, 1
for j in range(2,n+1):
for i in range(0,j):
T[j] += T[i] * T[j-i-1]
return T[n]