# 95. Unique Binary Search Trees II
題目:<https://leetcode.com/problems/unique-binary-search-trees-ii/>
解法:遞迴法,題目要列出所有 binary search trees,所以要符合左子樹的值必須小於右子樹的值這個規則,所以遞迴的概念為從 1~n 取一個值當 root,接著列出小於它的所有 binary search trees,以及列出大於它的所有 binary search trees,然後建立左右子樹的所有排列組合即為答案
為實現使遞迴法,定義遞迴函數為 bst(start, end) ,其中 start 跟 end 兩個參數代表tree的值域範圍,而當取 i 為 root 時,左子樹群為 bst(start, i-1),右子樹群為 bst(i+1, end),base case 條件為 start > end,並回傳 NULL。
Python3:
``` python 3
# 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
def printInOrder(root):
if not root:
print("None")
return
if root.left:
printInOrder(root.left)
print(root.val, end=" ")
if root.right:
printInOrder(root.right)
class Solution:
def generateTrees(self, n: int) -> list[TreeNode]:
def bst(start, end):
if start > end:
return [None]
trees = []
for i in range(start, end+1):
leftTrees = bst(start, i-1)
rightTrees = bst(i+1, end)
for left in leftTrees:
for right in rightTrees:
trees.append(TreeNode(i, left, right))
return trees
return bst(1, n)
if __name__ == '__main__':
n = 4
ans = Solution().generateTrees(n)
for t in ans:
printInOrder(t)
print()
```
C:
``` c
#include <stdio.h>
#include <stdlib.h>
// Definition for a binary tree node.
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
struct TreeNode* insertLevelOrder(int *arr, int arrSize, int i) {
struct TreeNode *root = NULL;
if (i < arrSize) {
root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val = arr[i];
root->left = insertLevelOrder(arr, arrSize, 2 * i + 1);
root->right = insertLevelOrder(arr, arrSize, 2 * i + 2);
}
return root;
}
void printInOrder(struct TreeNode* root) {
if (root == NULL) {
printf("None");
return;
}
if (root->left != NULL)
printInOrder(root->left);
printf("%d ", root->val);
if (root->right != NULL)
printInOrder(root->right);
}
struct TreeNode** bst(int start, int end, int* returnSize) {
if (start > end) {
*returnSize = 1;
struct TreeNode **trees = (struct TreeNode**)malloc(sizeof(struct TreeNode*));
trees[0] = NULL;
return trees;
}
*returnSize = 0;
struct TreeNode **trees = (struct TreeNode**)malloc(sizeof(struct TreeNode*));
int idx = 0;
for (int i = start; i <= end; i++) {
struct TreeNode **leftTrees, **rightTrees;
int leftSize, rightSize;
leftTrees = bst(start, i-1, &leftSize);
rightTrees = bst(i+1, end, &rightSize);
*returnSize += leftSize * rightSize;
trees = realloc(trees, sizeof(struct TreeNode*) * (*returnSize));
for (int j = 0; j < leftSize; j++) {
for (int k = 0; k < rightSize; k++) {
struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val = i;
root->left = leftTrees[j];
root->right = rightTrees[k];
trees[idx++] = root;
}
}
}
return trees;
}
struct TreeNode** generateTrees(int n, int* returnSize) {
return bst(1, n, returnSize);
}
int main() {
int n = 3;
int returnSize;
struct TreeNode** ans = generateTrees(n, &returnSize);
printf("returnSize: %d\n", returnSize);
for (int i = 0; i < returnSize; i++) {
printInOrder(ans[i]);
printf("\n");
}
return 0;
}
```
###### tags: `leetcode` `binary tree` `recursion`