Description:
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
分析:Unique Binary Search Trees是算出所有二叉搜索树的数量,这题是输出二叉搜溹树的集合;和combination和permutation类似,使用递归构造,不过这样得构造产生了一个问题,那就是结果中的树相互之间是有公共子树的。如果要求返回的树必须是相互独立的树的话,我们可以构造一个函数copy_trees,在每次组合的时候使用重新复制构造的新树,有兴趣的可以尝试一下。
代码:
/**
* 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) {
vector<TreeNode*> ret;
if(n < 1)
return ret;
dfs_generate(ret, 1, n);
return ret;
}
void dfs_generate(vector<TreeNode*>& ret, int min , int max)
{
if(min > max)
{
ret.push_back(nullptr);
return;
}
for(int i = min; i <= max; i++)
{
vector<TreeNode*> left_trees;
vector<TreeNode*> right_trees;
dfs_generate(left_trees, min, i - 1);
dfs_generate(right_trees, i + 1, max);
for(auto lt : left_trees)
{
for(auto rt : right_trees)
{
TreeNode* root = new TreeNode(i);
root->left = lt;
root->right = rt;
ret.push_back(root);
}
}
}
}
};
你必须非常努力,才能显得毫不费力!