这个题读完以后,我对语法结构不感兴趣,但是我对这个二叉搜索树的个数起了浓厚的兴趣,总觉得冥冥中蕴含着数学规律。
上一题是 不同的二叉搜索树Ⅱ
我就找了找 不同的二叉搜索树Ⅰ
这个题 输入一个数,然后再输出一个数字
这里引入卡特兰数
其中介绍了G(n)和F(i,n)。
假设n个节点的二叉树搜索树的个数是Gn,以 i(1 <= i <= n) 为根节点的二叉搜索树个数定义为F(i,n)
并介绍卡特兰数与二叉搜索树的关系
class Solution:
def numTrees(self, n: int) -> int:
g=[1 for i in range(n+1)]
for i in range(1,n):
g[i+1]=2*g[i]*(2*i+1)/(i+2)
return int(g[n])
好了接下来开始写正题
递归
左右递归
一直构建树,最后出来一个
G
n
G_{n}
Gn个树构成一个列表
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def generateTrees(self, n: int) -> List[TreeNode]:
def tree(start,end):
if start >end:
return [None]
res=[]
for i in range(start,end+1):
left=tree(start,i-1)
right=tree(i+1,end)
for l in left:
for r in right:
a=TreeNode(i)
a.left=l
a.right=r
res.append(a)
return res
return tree(1,n) if n else []
他这个复杂度是
4
n
n
\frac{4^n}{\sqrt{n}}
n4n,这个推导我也不懂
但我认为这出自卡特兰数的递推公式
G
n
+
1
=
4
n
+
2
n
+
2
G
n
G_{n+1}=\frac{4n+2}{n+2}G_{n}
Gn+1=n+24n+2Gn