题解
卡特兰数问题
递归
二叉排序树的重要性质是,左子树上的节点值一定小于根节点,右子树上的节点值一定大于根节点。由此,可知若根节点为 i i i,则左子树的节点为 [ 1 , . . . , i − 1 ] [1,...,i-1] [1,...,i−1],右子树的节点为 [ i + 1 , . . . , n ] [i+1,...,n] [i+1,...,n]。可递归的构建二叉搜索树。
-
特判,若 n = = 0 n==0 n==0,返回 [ ] [] []
-
定义生成树函数 b u i l d _ T r e e s ( l e f t , r i g h t ) build\_Trees(left,right) build_Trees(left,right),表示生成 [ l e f t , . . . , r i g h t ] [left,...,right] [left,...,right]的所有可能二叉搜索树:
- 若 l e f t > r i g h t left>right left>right,说明为空树,返回 [ N o n e ] [None] [None]
- 初始化所有可能的二叉搜索树列表 a l l _ t r e e s = [ ] all\_trees=[] all_trees=[]
- 遍历每一种可能的节点
i
i
i,遍历区间
[
l
e
f
t
,
r
i
g
h
t
+
1
)
[left,right+1)
[left,right+1):
- 所有可能的左子树列表 l e f t _ t r e e s = b u i l d _ T r e e s ( l e f t , i − 1 ) left\_trees=build\_Trees(left,i-1) left_trees=build_Trees(left,i−1)
- 所有可能的右子树列表 r i g h t _ t r e e s = b u i l d _ T r e e s ( i + 1 , r i g h t ) right\_trees=build\_Trees(i+1,right) right_trees=build_Trees(i+1,right)
- 组合所有的方式,遍历左子树列表,
l
l
l:遍历右子树列表,
r
r
r
- 建立当前树节点 c u r _ t r e e = T r e e N o d e ( i ) cur\_tree=TreeNode(i) cur_tree=TreeNode(i)
- 将 c u r _ t r e e cur\_tree cur_tree左子树置为 l l l
- 将 c u r _ t r e e cur\_tree cur_tree右子树置为 r r r
- 将 c u r _ t r e e cur\_tree cur_tree加入树列表中
- 返回树列表 a l l _ t r e e s all\_trees all_trees
-
返回 b u i l d _ T r e e s ( 1 , n ) build\_Trees(1,n) build_Trees(1,n)
复杂度分析
- 时间复杂度: O ( 4 n n 1 / 2 ) O(\frac{4^{n}} {n^{1/2}}) O(n1/24n)
- 空间复杂度: O ( 4 n n 1 / 2 ) O(\frac{4^{n}} {n^{1/2}}) O(n1/24n)
Python
# 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]:
if(n==0):
return []
def build_Trees(left,right):
all_trees=[]
if(left>right):
return [None]
for i in range(left,right+1):
left_trees=build_Trees(left,i-1)
right_trees=build_Trees(i+1,right)
for l in left_trees:
for r in right_trees:
cur_tree=TreeNode(i)
cur_tree.left=l
cur_tree.right=r
all_trees.append(cur_tree)
return all_trees
res=build_Trees(1,n)
return res