不同的二叉搜索树 II
给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。
提示:
0 <= n <= 8
解题思路
二叉搜索树有以下几个特点:
(1)、左边的小于当前;
(2)、右边的大于当前;
(3)、没有重复的值。
为了符合二叉搜索树的这几个特点,我们需要知道当前的范围。(要知道开头和结尾;最开始是1和n)
1、首先定义一个字典保存已遍历的参数和结果以免重复。
2、特殊情况判断:如果n == 0,返回[],如果不判断则会返回[None](执行递归代码会直接返回,因为0<1)。
3、递归终止条件:
如果left>right则返回[None]。
以前已经遍历过当前节点则可以直接返回以前的结果。
当前的值可能是left……right,所以我们要把每一个都试一遍,每次循环都要这么做:
递归得到左和右,将返回列表增加它们的全部组合。(值:当前循环变量,左:当前左,右:当前右)
将元组(left,right)作为键,返回列表为值加入字典,然后返回。
代码
class Solution:
def generateTrees(self, n: int) -> List[TreeNode]:
if n == 0:
return []
dct = {}
def left_right(left: int, right: int) -> List[TreeNode]:
if left > right:
return [None]
if (left, right) in dct:
return dct[(left, right)]
ret = []
for i in range(left, right+1):
left_lst = left_right(left, i-1)
right_lst = left_right(i+1, right)
for L in left_lst:
for R in right_lst:
app_Tree = TreeNode(i)
app_Tree.left = L
app_Tree.right = R
ret.append(app_Tree)
dct[(left, right)] = ret
return ret
left_right(1, n)
return left_right(1, n)