- 给出n,给出可能出现的二傻搜索树的种类个数
- 数目为k的bst,其每个 0 ~ k - 1都可以分成两个区间, 然后又可以生成bst, 所以k的bst种类数等于取k左侧与右侧可划分成bst的乘机的总和
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n+1);
dp[0] = 1;
for(int i = 1; i <= n; ++i){
if(i < 3){
dp[i] = i;
continue;
}
for(int j = 0; j < i; ++j){
dp[i] += dp[j] * dp[i - j - 1];
}
}
return dp[n];
}
};
class Solution {
public:
vector<TreeNode*> generateTrees(int n) {
return createNode(1, n);
}
vector<TreeNode*> createNode(int start, int end)
{
vector<TreeNode*> result;
if(start > end){
result.push_back(NULL);
return result;
}
for(int i = start; i <= end; ++i){
vector<TreeNode*> leftNode = createNode(start, i - 1);
vector<TreeNode*> rightNode = createNode(i + 1, end);
for(int j = 0; j < leftNode.size(); ++j){
for(int k = 0; k < rightNode.size(); ++k){
TreeNode * tmpNode = new TreeNode(i);
tmpNode->left = leftNode[j];
tmpNode->right = rightNode[k];
result.push_back(tmpNode);
}
}
}
return result;
}
};