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

[LeetCode] 95. Unique Binary Search Trees II & I

2017-02-27 00:10 344 查看

[LeetCode] 95. Unique Binary Search Trees II & I

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.



每次把数组分成两半,然后递归构造树。

class Solution {
public:
vector<TreeNode*> helper(vector<int> vals) {
int len = vals.size();
if (len == 0) return vector<TreeNode*>(1, NULL);
vector<TreeNode*> res;
for (int i=0; i<len; ++i) {
vector<int> leftv;
vector<int> rightv;
for (int j=0; j<i; ++j) {
leftv.push_back(vals[j]);
}
for (int j=i+1; j<len; ++j) {
rightv.push_back(vals[j]);
}
vector<TreeNode*> lroot = helper(leftv);
vector<TreeNode*> rroot = helper(rightv);
for (int il=0; il<lroot.size(); ++il) {
for (int ir=0; ir<rroot.size(); ++ir) {
TreeNode* now = new TreeNode(vals[i]);
now->left = lroot[il];
now->right = rroot[ir];
res.push_back(now);
}
}
}
return res;
}

vector<TreeNode*> generateTrees(int n) {
if (n == 0) return vector<TreeNode*>(0);
vector<int> vals(n, 0);
for (int i=0; i<n; ++i) {
vals[i] = i+1;
}
return helper(vals);
}
};


当实现了II的时候,发现I的那题原来就是一个卡特兰数。

catalan
= c[1]*c[n-1] + c[2]*c[n-2] + … + c[n-1]*c[1]。

class Solution {
public:
int numTrees(int n) {
vector<int> catalan(n+1, 0);
catalan[0] = 1;
catalan[1] = 1;
for (int i=2; i<=n; ++i) {
for (int j=0; j<i; ++j) {
catalan[i] += catalan[j] * catalan[i-j-1];
}
}
return catalan
;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode bst