问题描述
Given an integer n, generate all structurally unique BST’s (binary search trees) that store values 1…n.For example,
Given n = 3, your program should return all 5 unique BST’s shown below.1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
解决思路。
参见96.Unique Binary Search Trees,第96题要求的是二叉搜索树有多少棵,这个就很简单,分析一下就可以知道它的答案是卡特兰数。对于 1<= i <= n. 我们以i为节点,比它小的数字进行构造左边的二叉搜索树,比它大的进行构造右边的二叉搜索树。这样的情况有f(i-1)*f(n-i)。这个显然就是卡特兰数的问题了。
这题也是一样的思路,利用递归构造子树数组即可。代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<TreeNode*> generateTrees(int n) {
if ( n == 0)
return vector<TreeNode*>();
vector<int> nums(n,0);
for (int i = 0; i < n; ++i) {
nums[i] = i + 1;
}
return helper(nums);
}
vector<TreeNode*> helper(vector<int>nums) {
if (nums.size() == 0) {
TreeNode* leaf = NULL;
vector<TreeNode*> result;
result.push_back(leaf);
return result;
}
if (nums.size() == 1) {
TreeNode* leaf = new TreeNode(nums[0]);
vector<TreeNode*> result;
result.push_back(leaf);
return result;
}
vector<TreeNode*> result;
for (int i = 0; i < nums.size(); ++i) {
vector<int> left(i);
if (i != 0)
copy(nums.begin(),nums.begin()+i,left.begin());
vector<int> right(nums.size()-i-1);
if (nums.size()-i-1 != 0)
copy(nums.begin()+i+1,nums.end(),right.begin());
vector<TreeNode*> l_result = helper(left);
vector<TreeNode*> r_result = helper(right);
for (int m = 0; m < l_result.size(); ++m) {
for (int n = 0; n < r_result.size(); ++n) {
TreeNode* root = new TreeNode(nums[i]);
root->left = l_result[m];
root->right = r_result[n];
result.push_back(root);
}
}
}
return result;
}
};