题目描述:
给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
示例:
输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
个人思路:
我看到这道题的第一反应是用递归。因为首先1...n是一个天然有序的列表,从中以任意一个元素将列表分割成左右两部分,这两部分内部依然可以保持有序。而二叉搜索树维持的是一个节点间的相对关系,换句话说若一个列表元素的个数一定,相对关系也一致的话,那么这个列表可以确定出的二叉搜索树的结构数也是确定的。
基于以上分析,可以依次以这几个节点为根,将所有节点分为左(值小于该节点)右(值大于该节点)两个部分,那么以该节点为根的二叉搜索树的结构个数=左子树的结构数*右子树的结构数,并可以递归进行计算。当然递归过程中会有很多重复计算,不够高效,可以采用更为高效的动态规划算法进行计算。
具体代码如下:
# 递归
class Solution:
def numTrees(self, n: int) -> int:
if n <= 1:
return n
num = 0
# 根据对称性,减少计算量
for i in range(n // 2):
num += self.numTrees(i) + self.numTrees(n - 1 - i)
num *= 2
return num if n % 2 == 0 else num + self.numTrees(n // 2)
# 动态规划 摘自官方题解
class Solution:
def numTrees(self, n):
"""
:type n: int
:rtype: int
"""
G = [0]*(n+1)
G[0], G[1] = 1, 1
for i in range(2, n+1):
for j in range(1, i+1):
G[i] += G[j-1] * G[i-j]
return G[n]
作者:LeetCode
链接:https://leetcode-cn.com/problems/unique-binary-search-trees/solution/bu-tong-de-er-cha-sou-suo-shu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2393

被折叠的 条评论
为什么被折叠?



