- Unique Binary Search Trees II
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]]
题意:给出 n ,用 1-n 序列创建出所有的BST
思路:同96一样,利用BST的基本性质:根大于左子树小于右子树,轮流从1-n中选取一个根节点,然后递归划分区间。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
// 递归获得所有 [strat,end] 区间的 BST
vector<TreeNode*> create(int start,int end){
// printf("%d %d\n",start,end);
vector<TreeNode*> allTrees;
if(start > end){
allTrees.push_back(NULL);
return allTrees;
}
// 遍历序列,轮流作为根节点
for(int i = start;i <= end;++i){
// 递归获得所有左子树的 BST
vector<TreeNode*> leftTrees = create(start,i-1);
vector<TreeNode*> rightTrees = create(i+1,end);
// 分别从 左右子树的集合中选一个插入根节点
for(int j = 0;j < leftTrees.size();++j){
for(int k = 0;k < rightTrees.size();++k){
TreeNode* root = new TreeNode(i);
root->left = leftTrees[j];
root->right = rightTrees[k];
allTrees.push_back(root);
}
}
}
return allTrees;
}
vector<TreeNode*> generateTrees(int n) {
return create(1,n);
}
};