# Unique Binary Search Trees II Leetcode Solution

In this post, we are going to solve the Unique Binary Search Trees II Leetcode Solution problem of Leetcode. This Leetcode problem is done in many programming languages like C++, Java, and Python.

## Problem

Given an integer `n`, return all the structurally unique BST’s (binary search trees), which has exactly `n` nodes of unique values from `1` to `n`. Return the answer in any order.

Example 1:

```Input: n = 3
Output: [[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
```

Example 2:

```Input: n = 1
Output: [[1]]
```

Constraints:

• `1 <= n <= 8`

Now, lets see the leetcode solution of Unique Binary Search Trees II Leetcode Solution.

### Unique Binary Search Trees IILeetcode Solution in Python

```class Solution:
def generateTrees(self, n: int) -> List[TreeNode]:
if n == 0:
return []

def generateTrees(mini: int, maxi: int) -> List[Optional[int]]:
if mini > maxi:
return [None]

ans = []

for i in range(mini, maxi + 1):
for left in generateTrees(mini, i - 1):
for right in generateTrees(i + 1, maxi):
ans.append(TreeNode(i))
ans[-1].left = left
ans[-1].right = right

return ans

return generateTrees(1, n)
```

### Unique Binary Search Trees II Leetcode Solutionin CPP

```class Solution {
public:
vector<TreeNode*> generateTrees(int n) {
if (n == 0)
return {};
return generateTrees(1, n);
}

private:
vector<TreeNode*> generateTrees(int min, int max) {
if (min > max)
return {nullptr};

vector<TreeNode*> ans;

for (int i = min; i <= max; ++i)
for (TreeNode* left : generateTrees(min, i - 1))
for (TreeNode* right : generateTrees(i + 1, max)) {
ans.push_back(new TreeNode(i));
ans.back()->left = left;
ans.back()->right = right;
}

return ans;
}
};
```

### Unique Binary Search Trees II Leetcode Solution in Java

```class Solution {
public List<TreeNode> generateTrees(int n) {
if (n == 0)
return new ArrayList<>();
return generateTrees(1, n);
}

private List<TreeNode> generateTrees(int min, int max) {
if (min > max)
return Arrays.asList((TreeNode) null);

List<TreeNode> ans = new ArrayList<>();

for (int i = min; i <= max; ++i)
for (TreeNode left : generateTrees(min, i - 1))
for (TreeNode right : generateTrees(i + 1, max)) {