题目
Given 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.
思路
此题最好想的思路是递归,当确定根节点是
i
时,左子树由
还有一种思路就是动态规划,用一个二维数组保存从s到e的所有子树的vector。amap[s][e] 保存的是一个数组,表示s到e之间所有子树的根节点。在动态规划遍历的时候,先计算s和e相等的情况,再依次计算s和e差1,差2的情况。
代码
递归
vector<TreeNode*> dfs (int s, int e){
vector<TreeNode*> v;
if (s>e){
v.push_back(NULL);
return v;
}
if (s==e){
v.push_back(new TreeNode(s));
return v;
}
for (int i=s;i<=e;++i){
vector<TreeNode*> left = dfs(s,i-1);
vector<TreeNode*> right = dfs(i+1,e);
for (TreeNode* lnode:left){
for (TreeNode* rnode:right){
TreeNode* root = new TreeNode(i);
root -> left = lnode;
root ->right = rnode;
v.push_back(root);
}
}
}
return v;
}
vector<TreeNode*> generateTrees(int n) {
if (!n) {vector<TreeNode*> v;return v;}
return dfs(1,n);
}
动归
vector<TreeNode*> generateTrees(int n) {
if (!n) {vector<TreeNode*> v;return v;}
vector<TreeNode*> vec1;
vec1.push_back(NULL);
vector<vector<TreeNode*> > vec2(n+2,vec1);
vector<vector<vector<TreeNode*> > > amap(n+2,vec2);
for (int gap=0;gap<n;++gap){
for (int s=1;s<=n-gap;++s){
int e = s+gap;
vector<TreeNode*> v;
for (int i=s;i<=e;++i){
for (auto lnode:amap[s][i-1]){
for (auto rnode:amap[i+1][e]){
TreeNode* root = new TreeNode(i);
root->left=lnode;
root->right=rnode;
v.push_back(root);
}
}
}
amap[s][e]=v;
}
}
return amap[1][n];
}