您的位置:首页 > 产品设计 > UI/UE

LeetCode Unique Binary Search Trees II

2014-07-27 21:59 513 查看
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.

1         3     3      2      1
\       /     /      / \      \
3     2     1      1   3      2
/     /       \                 \
2     1         2                 3


confused what
"{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.

class Solution {
private:
vector<TreeNode *> res;
public:
vector<TreeNode *> generateTrees(int n) {
res.clear();
res = dfs(1, n + 1);
return res;
}

vector<TreeNode*> dfs(int start, int end) {
vector<TreeNode*> res;
if (start >= end) {
res.push_back(NULL);
return res;
}
TreeNode* rt = NULL;
for (int i=start; i<end; i++) {
vector<TreeNode*> lsub = dfs(start, i);
vector<TreeNode*> rsub = dfs(i+1, end);

for (int li=0; li<lsub.size(); li++) {
for (int ri=0; ri<rsub.size(); ri++) {
rt = new TreeNode(i);
rt->left = lsub[li];
rt->right= rsub[ri];
res.push_back(rt);
}
}
}
return res;
}
};


递归真是个好东西!

第二轮:

写一个非递归的,不过感觉内存占用应该会大许多吧

/**
* 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) {
unordered_map<long, vector<TreeNode*> > dp;

dp.insert(make_pair(0, vector<TreeNode*>(1, NULL)));

for (int k=0; k<=n; k++) {
for (int i=0; (i + k) <= n; i++) {
int from = i, to = i + k;
vector<TreeNode*> trees;
for (int r = from; r<=to; r++) {
vector<TreeNode*>& lsub = dp[id(from, r-1)];
vector<TreeNode*>& rsub = dp[id(r+1, to)];

for (TreeNode* lsubroot : lsub) {
for (TreeNode* rsubroot: rsub) {
TreeNode* root = new TreeNode(r);
root->left = lsubroot;
root->right= rsubroot;
trees.push_back(root);
}
}
}
dp.insert(make_pair(id(from, to), trees));
}
}
return dp[id(1, n)];
}

long id(long from, long to) {
return from > to ? 0 : (from<<32)|to;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: