- 不同的二叉搜索树 II
给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。
示例:
输入: 3
输出:
[
[1,null,3,2],
[3,2,null,1],
[3,1,null,null,2],
[2,1,3],
[1,null,2,null,3]
]
解释:
以上的输出对应以下 5 种不同结构的二叉搜索树:
1 3 3 2 1
\ / / / \
3 2 1 1 3 2
/ / \
2 1 2 3
这个问题的关键也在于递归,你要知道递归的是啥,对于一个树来说,左边的子树的值比他小,有边比他大,那么可以看成左边子树为一个独立的树他的值
我下面的方面则是借鉴了解答的动态规划方法,对于动态规划来说你m到n这几个数的子树是由m+1到n和m到n-1决定的
关键在于找到其中的关联
class Solution:
def generateTrees(self, n: int):
if n == 0:
return None
# 对dp进行初始化
dp = []
for i in range(0, n+1): # 初始化dp
dp.append([])
for j in range(0, n+1):
if i == j:
dp[i].append([TreeNode(i)])
elif i < j:
dp[i].append([])
else:
dp[i].append([None])
dp[0][0] = [None]
for i in range(n-1, 0, -1): # 自下向上进行循环
for j in range(i+1, n+1):
for r in range(i, j+1): # i-j每一个节点为顶点的情况
left = r+1 if r < j else r # 右边的值需要边界判断,不然会溢出数组
for x in dp[i][r-1]: # 左右子树排列组合
for y in dp[left][j]:
node = TreeNode(r)
node.left = x
node.right = y
if r == j:
node.right = None
dp[i][j].append(node) # dp[i][j]添加此次循环的值
return dp[1][n]