"""
给定一个整数 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
 

提示：

0 <= n <= 8

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/unique-binary-search-trees-ii
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
"""

from typing import *

# Definition for a binary tree node.
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution:
    def generateSubTree(self, start, end) -> List[TreeNode]:
        if start > end:
            return [None]
        if start == end:
            return [TreeNode(start)]

        rtn = []
        for i in range(start, end + 1):
            left_list = self.generateSubTree(start, i - 1)
            right_list = self.generateSubTree(i + 1, end)
            for left in left_list:
                for right in right_list:
                    cur = TreeNode(i)
                    cur.left, cur.right = left, right
                    rtn.append(cur)
        return rtn

    def generateTrees(self, n: int) -> List[TreeNode]:
        if n == 0:
            return []
        return self.generateSubTree(1, n)